5 种 Redis 数据备份与恢复方式

打印 上一主题 下一主题

主题 1839|帖子 1839|积分 5517

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Redis 数据备份与恢复

1. 命令行执行 save 手动开启 RDB 持久化

使用 RDB 文件做迁移时,必要留意必要先关闭掉目标 redis 的 aof 功能,因为如果二者同时存在的话,会优先于 aof 的方式举行数据恢复。
  1. redis-cli -h {target-host} -a {target-password} config set appendonly no
复制代码
备份

  1. # 会阻塞主进程
  2. 127.0.0.1:6379> save
  3. OK
  4. # 通过 fork 一个专门 save 的子进程,从而不会阻塞主进程
  5. 127.0.0.1:6379> bgsave
  6. Background saving started
复制代码
恢复

  1. # 查看 redis 默认存放备份文件的目录路径
  2. 127.0.0.1:6379> config get dir
  3. # 查看备份 RDB 文件的名称,默认为 `dump.rdb`
  4. 127.0.0.1:6379> config get dbfilename
复制代码
将备份之后的 dump.rdb 文件放到 config get dir 命令得出的目录路径下,然后重启 redis 即可恢复。(发起备份的时间,可以将 redis 临时关闭)
2. 通过命令行手动开启 AOF 持久化

备份

  1. # 先清空目标 redis 中全部数据
  2. redis-cli -h {target-host} -a {target-password} flushall
  3. # 然后在源 redis 中生成 aof 备份文件
  4. redis-cli -h {source-host} -a {source-password} config set appendonly yes
  5. # 查看生成后的 appendonly.aof 文件所在目录
  6. 127.0.0.1:6379> config get dir
  7. # 查看备份的 aof 文件的名称,默认为 `appendonly.aof`
  8. 127.0.0.1:6379> config get appendfilename
复制代码
恢复

  1. # 将 `appendonly.aof` 文件放在当前路径下
  2. redis-cli -h {target-host} -a {target-password} --pipe < appendonly.aof
  3. # 源 redis 关闭 aof 功能
  4. redis-cli -h {source-host} -a {source-password} config set appendonly no
复制代码
将备份之后的 appendonly.aof 文件放到 config get dir 命令得出的目录路径下,然后重启 redis 也应该可恢复(具体我没有实操,看资料所说如此)。
3. 使用 redis-dump

redis-dump 是一个用于 redis 数据导入导出的工具(可以以新增的形式导入),是基于 Ruby 实现的,因此必要先安装 Ruby 环境,发起安装 2.6.1 版本以上的 Ruby。
MAC 上使用 Homebrew 安装 Ruby

  1. brew install ruby
复制代码
使用 rvm (ruby 版本管理器)安装 ruby

centos 7 上安装 rvm

  1. curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
  2. curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
  3. # 安装成功之后退出终端,然后可以通过 `rvm help` 进行查看
  4. \curl -sSL https://get.rvm.io | bash -s stable
  5. # 如果不想退出终端,可以直接重载配置文件
  6. source /etc/profile.d/rvm.sh
复制代码
rvm 常用命令

  1. # 列出已知的 ruby 版本
  2. rvm list known
  3. # 安装指定版本的 ruby
  4. rvm install 2.3.0
  5. # 更新 rvm
  6. rvm get stable
  7. # 切换到指定 ruby 版本
  8. rvm use 2.2.1
  9. # 设置指定 ruby 版本为默认版本
  10. rvm use 2.2.2 --default
  11. # 查询已经安装的 ruby 版本
  12. rvm list
  13. # 卸载指定的 ruby 版本
  14. rvm remove 1.9.1
复制代码
安装 redis-dump

  1. # 安装 ruby 2.6.1
  2. rvm install 2.6.1
  3. # 使用 2.6.1
  4. rvm use 2.6.1
  5. rvm use 2.6.1 --default
  6. # 查看 ruby 版本
  7. ruby --version
  8. # 替换 gem 镜像地址
  9. gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
  10. # 查看镜像地址是否更换成功
  11. gem sources -l
  12. # 安装 redis-dump
  13. gem install redis-dump -V
复制代码
redis-dump 备份与恢复

   以增量的形式恢复
  备份

  1. # 数据导出
  2. redis-dump -u 127.0.0.1:6379 > data.json
  3. # 导出指定数据库中的数据,比如说 8 号数据库
  4. redis-dump -u 127.0.0.1:6379 -d 8 > data8.json
  5. # 如果 redis 设置了有密码
  6. redis-dump -u {host} -a {password} > data.json
  7. redis-dump -u :{password}@127.0.0.1:6379 > data.json
  8. # 如果需要导出的 redis 是一个 URL 连接地址时,貌似可以这样(没有实操过,具体不清楚)
  9. redis-dump -u :{password}@{domain}:{port}
  10. # eg: redis-dump -u :123456@www.alex.com:9055
复制代码
恢复

  1. # 导入命令
  2. cat data.json | redis-load
  3. # 或者
  4. < data.json redis-load
  5. # 导入数据到 8 号数据库
  6. cat data8.json | redis-load -u 127.0.0.1:6379 -a 123456 -d 8
  7. # 或者
  8. < data8.json redis-load -u 127.0.0.1:6379 -a 123456 -d 8
  9. # 如果以上命令是因为 utf-8 格式报错时,可以加上 `-n` 参数
  10. cat data8.json | redis-load -n -u 127.0.0.1:6379 -a 123456 -d 8
  11. # 如果 redis 设置了有密码
  12. cat data.json | redis-load -u :password@127.0.0.1:6379
复制代码
4. 通过脚本实现迁移

  1. #!/bin/bash
  2. # 通过这个脚本执行备份有两个缺点,一是使用了 `keys *` ,二是那就是会将 source_host 中所有的 key
  3. # 同步到 target_host 时,会自动改成永不过期
  4. # 详见 `restore` 命令
  5. # 后期有时间了,再考虑优化的事情吧
  6. # document link: https://www.redis.com.cn/commands/restore.html
  7. source_host=127.0.0.1
  8. source_port=6379
  9. source_password=''
  10. source_db=1
  11. target_host=127.0.0.1
  12. target_port=6379
  13. target_password=''
  14. target_db=2
  15. if [[ -z $source_password ]] && [[ -z $target_password ]]
  16. then
  17.   redis-cli -h ${source_host} -p ${source_port} -n ${source_db} keys '*' | while read key
  18.   do
  19.       redis-cli -h ${source_host} -p ${source_port} -n ${source_db} --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h ${target_host} -p ${target_port} -n ${target_db} -x restore $key 0
  20.       echo "migrate key $key"
  21.   done
  22. elif [[ -z $source_password ]] && [[ -n $target_password ]]
  23. then
  24.   redis-cli -h ${source_host} -p ${source_port} -n ${source_db} keys '*' | while read key
  25.   do
  26.       redis-cli -h ${source_host} -p ${source_port} -n ${source_db} --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h ${target_host} -p ${target_port} -a ${target_password} -n ${target_db} -x restore $key 0
  27.       echo "migrate key $key"
  28.   done
  29. elif [[ -n $source_password ]] && [[ -z $target_password ]]
  30. then
  31.   redis-cli -h ${source_host} -p ${source_port} -a ${source_password} -n ${source_db} keys '*' | while read key
  32.   do
  33.       redis-cli -h ${source_host} -p ${source_port} -a ${source_password} -n ${source_db} --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h ${target_host} -p ${target_port} -n ${target_db} -x restore $key 0
  34.       echo "migrate key $key"
  35.   done
  36. else
  37.   redis-cli -h ${source_host} -p ${source_port} -a ${source_password} -n ${source_db} keys '*' | while read key
  38.   do
  39.       redis-cli -h ${source_host} -p ${source_port} -a ${source_password} -n ${source_db} --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h ${target_host} -p ${target_port} -a ${target_password} -n ${target_db} -x restore $key 0
  40.       echo "migrate key $key"
  41.   done
  42. fi
  43. # 其实就是利用了 redis 的 dump 和 restore 命令
  44. # eg:
  45. # 127.0.0.1:6379[1]> set hello "hello, dumping world!"
  46. # OK
  47. # 127.0.0.1:6379[1]> dump hello
  48. # "\x00\x15hello, dumping world!\t\x00\x03\xbfc\xcey\xa1\x9e\xfc"
  49. # 127.0.0.1:6379[1]> restore hello1 0 "\x00\x15hello, dumping world!\t\x00\x03\xbfc\xcey\xa1\x9e\xfc"
  50. # OK
  51. # 127.0.0.1:6379[1]> get hello1
  52. # "hello, dumping world!"
  53. # 127.0.0.1:6379[1]>
复制代码
5. redis 使用 migrate 命令迁移数据脚本

   这种方式在 key 比较多的情况下也不是很推荐。
  1. #!/bin/bash
  2. src_redis="10.8.163.1"
  3. src_port="6379"
  4. dest_redis="10.8.132.13"
  5. dest_port="6379"
  6. for y in $(redis-cli -h ${src_redis} -p ${src_port} keys "*"); do
  7.    redis-cli -h ${src_redis} -p ${src_port} migrate ${dest_redis} ${dest_port} ${y} 0 1000 copy replace
  8.    echo "$(date +%F\ %T) Copy key ${y} to new redis...."
  9. done
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表