08月18, 2020
收藏本站

导出导入redis数据

今天有个需求,从A服务器导出redis指定key的数据到B服务器。
度娘了下,四种方式:
一、 脚本导入

#!/bin/bash

#redis 源ip
src_ip=192.168.1.4
#redis 源port
src_port=6379
#redis 源password
src_pwd=123

#redis 目的ip
dest_ip=127.0.0.1
#redis 目的port
dest_port=6389
#redis 目的password
dest_pwd=123

#要迁移的key前缀(替换成自己要导入的key前缀)
key_prefix=abul

redis-cli -h $src_ip -p $src_port -a $src_pwd keys "${key_prefix}*" | while read key
do
  #先删除key,再插入
  redis-cli -h $dest_ip -p $dest_port -a $dest_pwd del $key
  redis-cli -h $src_ip -p $src_port -a $src_pwd --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h $dest_ip -p $dest_port -a $dest_pwd -x restore $key 0
  echo "$i migrate key $key"
done

我使用的就是这种方式,因为需要导入的只是指定key,也比较简单,但也遇到一些小坑,后面会讲。
二、 aof 导入方式
将源 Redis 生成 AOF 数据文件

127.0.0.1:6379> config set appendonly yes
OK

生成的appendonly.aof文件在dir目录,可通过config get dir获得

127.0.0.1:6379> config get dir
1) "dir"
2) "/var/redis/6379"

导入目标redis实例 redis-cli -h 目标RedisIp -a password --pipe < appendonly.aof 三、 redis-dump工具
安装redis-dump工具

yum install ruby rubygems ruby-devel -y
# 替换镜像地址
gem sources --add http://gems.ruby-china.org/
# 确认镜像地址是否替换成功
gem sources -l
# 替换成功后再安装 redis-dump
gem install redis-dump -V

安装完成后,开始导出

# redis-dump 导出
redis-dump -u :password@源RedisIp:6379 > 源Redis数据文件.json
# redis-load 导入
cat 源Redis数据文件.json | redis-load -u :password@目标RedisIp:6379

四、 rdb 文件迁移
源实例关闭 aof 功能 config set appendonly no
固化数据到 RDB 文件 save
save 完成后,还是通过 config get dir 命令获得保存的 RDB 数据文件位置,并关闭redis。
然后复制源 redis 的 rdb 文件到目标 Redis 的 dir 数据目录,名字为你要迁移的 redis 的 rdb 文件名。
复制完成后,重启目标 Redis 实例,数据就迁移完成了。

遇到的小坑:

  1. 存在跨服务器导出或读取数据
    Could not connect to Redis at 10.10.10.159:6379: Connection refused
    首先目标服务器防火墙如果开启,需要开放6379端口;另外目标redis.conf配置的bind需要指定为0.0.0.0。
  2. 不同版本redis导入数据报错
    ERR DUMP payload version or checksum are wrong
    不同版本导致,处理办法:
    1)开启源实例aof持久化功能
    config set appendonly yes
    2)手动进行aof持久化
    bgrewriteaof
    3)新建一个redis实例,与目标实例版本相同并启动
    将源实例的redis的aof文件导入新建实例
    redis-cli -h 127.0.0.1 -p 6395 -a password --pipe < appendonly.aof
    最后通过一的脚本导入。

Comments