redis迁移
redis的几种数据导入导出方式【转】
环境说明:
202.102.221.11 redis源实例
202.102.221.12 redis目标实例
202.102.221.13 任意linux系统
一、redis-dump方式
1.安装redis-dump工具
redis-dump 工具安装
redis-dump
是一个第三方的工具,这就意味着需要安装才能使用,它依赖与ruby。 经过踩坑发现对ruby版本还是有要求的,Centos 7.+使用yum info ruby
发现版本为2.0.0.+
,这个时候你大概率会很麻烦,你需要通过rvm升级ruby或源码安装ruby,而不能简单使用yum进行升级。 如果你使用Ubuntu 20,你可以使用apt-get install ruby-full
直接使用的。
这里使用两种方式安装ruby,推荐使用rvm
:
- 源码安装ruby
- rvm安装ruby
安装 ruby
安装必要的基础包:
ruby官网下载某个版本的ruby,我这里选择的是2.6.5版本:
安装ruby-2.6.5:
rvm安装 ruby
安装 redis-dump
2.redis-dump导出
[root@202.102.221.13 ~]# redis-dump -u :password@202.102.221.11:6379 > 202.102.221.11.json
3.redis-load导入
[root@202.102.221.13 ~]# cat 202.102.221.11.json | redis-load -u :password@202.102.221.12:6379
问题如下:
[root@ip-172-63-251-171 shell]# < /root/work/shell/redis-data/redis_db0_back.json redis-load -u localhost:6379
ERROR (Yajl::ParseError): lexical error: invalid bytes in UTF8 string.
lue":"\n\rhurong_system\u0011±ޒx\u0001\u0000\u0000\u0019±
(right here) ------^
解决办法
加上参数 -n
cat 202.102.221.11.json | redis-load -n -u :password@202.102.221.12:6379
二、aof导入方式
1.源实例生成aof数据
# 清空上文目标实例全部数据 [root@202.102.221.11 ~]# redis-cli -h 202.102.221.12 -a password flushall OK # 源实例开启aof功能,将在dir目录下生成appendonly.aof文件 [root@202.102.221.11 ~]# redis-cli -h 202.102.221.11 -a password config set appendonly yes OK
2.目标实例导入aof数据
# 假设appendonly.aof就在当前路径下 [root@202.102.221.11 ~]# redis-cli -h 202.102.221.12 -a password --pipe < appendonly.aof All data transferred. Waiting for the last reply... Last reply received from server. errors: 0, replies: 5 # 源实例关闭aof功能 [root@202.102.221.11 ~]# redis-cli -h 202.102.221.11 -a password config set appendonly no OK
三、rdb文件迁移方式
(1)关闭要迁移到的服务器的redis的aof日志功能(我的要迁移到的是本机的redis6380.conf)
vim redis6380.conf,将appendonly yes修改为appendonly no
(2)我们先看一下当前redis的数据,并将数据用save命令固化到rdb文件中,我的rdb文件为/var/rdb/dump6379.rdb
(3)杀掉当前redis的进程,否则下一步的复制rdb文件,rdb处于打开的状态,复制的文件,会占用同样的句柄
(4)复制当前redis的rdb文件,名字为你要迁移的redis的rdb文件名(我的要迁移的redis的文件名为 /var/rdb/dump6380.rdb),记住,一定要杀掉当前redis的进程,还有关闭要迁移的服务器的aof功能(如果不关闭aof,默认用aof文件来恢复数据)
(5)启动6380的redis,我们会发现,6380多出了name的数据,这个数据,就是6379固化到rdb的数据
以上就是在不同的redis之间进行rdb的数据迁移,思路就是,复制rdb文件,然后让要迁移的redis加载这个rdb文件就ok了
四、源实例db0迁移至目标实例db1
[root@202.102.221.11 ~]# cat redis_mv.sh #!/bin/bash redis-cli -h 202.102.221.11 -p 6379 -a password -n 0 keys "*" | while read key do redis-cli -h 202.102.221.11 -p 6379 -a password -n 0 --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h 202.102.221.12 -p 6379 -a password -n 1 -x restore $key 0 echo "migrate key $key"