Redis数据导入导出


安装redis-dump
redis-dump是基于ruby开发,需要ruby环境,而且新版本的redis-dump要求2.2.2以上的ruby版本,centos中yum只能安装2.0版本的ruby。需要先安装ruby的管理工具rvm安装高版本的ruby


安装rvm
可参考官网:http://rvm.io/
执行下列两个命令安装rvm;

# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

# curl -sSL https://get.rvm.io | bash -s stable

# find / -name rvm -print
/usr/local/rvm
/usr/local/rvm/scripts/rvm
/usr/local/rvm/bin/rvm
/usr/local/rvm/src/rvm
/usr/local/rvm/src/rvm/scripts/rvm
/usr/local/rvm/src/rvm/bin/rvm
/usr/local/rvm/src/rvm/lib/rvm
/usr/local/rvm/lib/rvm


#使rvm生效
source /usr/local/rvm/scripts/rvm


安装ruby
# 查看可以安装的Ruby版本
rvm list known 
# 当前最高的稳定版本是2.5.1
rvm install ruby 2.5.1
#查看ruby版本
ruby --version
安装redis-dump


# 移除gem自带源,国内连不上
gem sources --remove https://rubygems.org/ 
# 添加国内淘宝源
gem sources -a https://gems.ruby-china.com
# 安装redis-dump
gem install redis-dump


#查看redis-dump版本,安装成功可以开心的备份和还原redis了
redis-dump -v
redis-dump v0.4.0


使用redis-dump导出数据
redis转存储json
redis-dump -u192.168.66.188:6379 -a Hexin188@2019  -d 15  >redis_db15.json
redis-dump -u 127.0.0.1:6379 -a password -d 0 > redis_6378.json


导出指定字符键值的数据:
如果只想导出特定的内容,比如想导出以adsl开头的数据,可以加入 -f 参数用来过滤,命令如下:
redis-dump -u :xxxx@localhost:6379 -f adsl:* > ./redis.data.jl
其中 -f 参数即Redis的keys命令的参数,可以写一些过滤规则。
命令:
只导出包含laravel_ding_talking键值的数据:
[root@node200 ~]# redis-dump -u192.168.66.188:6379 -a Hexin188@2019  -d 15 -f "laravel_ding_talking" >redis_laravel_ding_talking.json
导出的文件:
{"db":15,"key":"laravel_ding_talking:company_on_worker:ding3b2afc7d9807eefb:162722615937821762","ttl":28072,"type":"string","value":"陈晓铭","size":3}

json还原redis
[root@node200 ~]# cat redis_db14.json | redis-load -u127.0.0.1:6379 -a 123456 -d 14
[root@node200 ~]# cat redis_6378.json | redis-load -u 127.0.0.1 -a password


将数据导入到不同的数据库,通过修改备份文件:
将db:15库修改成db:14库:
 1039  sed -i "s#\"db\"\:15#\"db\"\:14#g" ./redis_db15.json 


查看导出的数据:
{"db":0,"key":"name","ttl":-1,"type":"string","value":"James","size":5}
{"db":0,"key":"name2","ttl":-1,"type":"string","value":"Durant","size":6}
{"db":0,"key":"name3","ttl":-1,"type":"string","value":"Durant","size":6}
{"db":0,"key":"name4","ttl":-1,"type":"string","value":"HelloWorld","size":10}
{"db":0,"key":"name5","ttl":-1,"type":"string","value":"James","size":5}
{"db":0,"key":"name6","ttl":-1,"type":"string","value":"James","size":5}
{"db":0,"key":"age","ttl":-1,"type":"string","value":"1","size":1}
{"db":0,"key":"age2","ttl":-1,"type":"string","value":"-5","size":2}
{"db":14,"key":"laravel_ding_talking:callback:user_add_org","ttl":21099,"type":"list","value":["{\"CorpId\":\"ding3b2afc7d9807eefb\",\"EventType\":\"user_add_org\",\"UserId\":[\"144064525335155610\"],\"OptStaffId\":\"1838075267778351\",\"TimeStamp\":\"1607391412476\"}"],"size":152}
{"db":14,"key":"laravel_ding_talking:callback:user_modify_org","ttl":41318,"type":"list","value":["{\"CorpId\":\"ding3b2afc7d9807eefb\",\"EventType\":\"user_modify_org\",\"UserId\":[\"15844056734541629\"],\"OptStaffId\":\"15616823617294801\",\"TimeStamp\":\"1607411634229\"}","{\"CorpId\":\"ding3b2afc7d9807eefb\",\"EventType\":\"user_modify_org\",\"UserId\":[\"144064525335155610\"],\"TimeStamp\":\"1607391412602\"}"],"size":278}

每条数据都包含6个字段,其中:
db即数据库代号,
key即键名,
ttl即该键值对的有效时间,
type即键值类型,
value即内容,
size即占用空间。


Redis集群数据导出导入
如果是redis集群模式,需要对集群各个实例分别导出导入,如下所示:

数据导出
命令(redis-dump -u :password@host:port -d 0 > fileName.json)无密码可省略
redis-dump -u IP1:6379 -d 0 > 6379.json
redis-dump -u IP2:6380 -d 0 > 6380.json
redis-dump -u IP3:6381 -d 0 > 6381.json

导出数据库
redis-dump -u 127.0.0.1:6379 -a sdfwew8w8w87ew9rw9r8wr98w7r9wsfs -d 15 >/root/d15.json

导出指定的键值:
 redis-dump -u 127.0.0.1:6379 -a sdfwew8w8w87ew9rw9r8wr98w7r9wsfs -d 15 -f "sorting:out:request:log" >/root/d15_f.json
执行完成命令之后,生成3个json文件,即为集群节点数据,为提升导入效率,可以将文件拷贝到目标集群机进行导入,也可以直接在本机导入。


数据导入
命令(cat filename.json | redis-load -u :password@host:port -d 0)无密码可省略
cat 6379.json | redis-load -u IP4:6379 -a password -d 0
cat 6380.json | redis-load -u IP5:6379 -a password -d 0
cat 6380.json | redis-load -u IP6:6380 -a password -d 0
注意:导入时json文件源集群节点和目的集群节点键所在的槽要对应,如果json的槽不是由导入节点处理的,会报错:提示MOVED 13596 host:port

异常处理
执行redis-dump命令时如果报ERR unknown command 'keys'异常

原因:keys命令用于全局查询 一般不建议使用所以能在redis.conf中配置了禁用该命令 。
解决方案: 检查redis.conf 中是否有该命令禁用配置
    rename-command FLUSHALL ""  清空所有的库数据
    rename-command FLUSHDB ""      清空当前库数据
    rename-command KEYS ""        查询所有库数据 (因为数据量大时,执行此操作会消耗大量的资源 一般不建议使用该命令)
如果有注释掉即可 !

分割线
打赏
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS