前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[记录点滴] 使用工具和命令对redis数据进行备份恢复

[记录点滴] 使用工具和命令对redis数据进行备份恢复

作者头像
罗西的思考
发布2020-09-07 16:41:49
1K0
发布2020-09-07 16:41:49
举报
文章被收录于专栏:罗西的思考

[记录点滴] 使用工具和命令对redis数据进行备份恢复

0x00 摘要

本文记录了如何使用工具对redis数据进行恢复备份,涉及的有Redis-Dump,MySQL,Redis管道命令。

0x01 简介

如果希望把Redis数据备份成json格式,我们可以使用Redis-Dump,其网址是 https://github.com/delano/redis-dump,目前版本是 v0.4 BETA。

如果想短期大规模进行批量插入,可以考虑使用管道。redis-cli实用程序支持称为管道的新模式,该模式就是为了执行批量插入而存在的。

0x02 安装Redis-Dump

node

编译需要使用到node,所以先安装node

下载npm包 wget https://nodejs.org/dist/v6.11.3/node-v6.11.3-linux-x64.tar.xz

解压,创建链接 将压缩包解压到/opt目录下。可以看到bin目录下有两个可执行文件node和npm,在/usr/local/bin中创建该文件的链接

代码语言:javascript
复制
tar -xvf node-v6.11.3-linux-x64.tar.xz
cd /opt/
mv /root/node-v6.11.3-linux-x64 .
sudo ln -s /opt/node-v6.11.3-linux-x64/bin/node /usr/local/bin/node
sudo ln -s /opt/node-v6.11.3-linux-x64/bin/npm /usr/local/bin/npm

然后使用node -v,npm -v验证是否成功

代码语言:javascript
复制
node -v
npm -v

Redis-Dump

安装redis-dump

代码语言:javascript
复制
npm install redis-dump -g
/opt/node-v6.11.3-linux-x64/bin/redis-dump -> /opt/node-v6.11.3-linux-x64/lib/node_modules/redis-dump/bin/cli/redis-dump
/opt/node-v6.11.3-linux-x64/lib
└─┬ redis-dump@0.1.10
  ├── async@1.5.2
  ├─┬ optimist@0.3.7
  │ └── wordwrap@0.0.3
  └─┬ redis@2.8.0
├── double-ended-queue@2.1.0-0
├── redis-commands@1.3.1
└── redis-parser@2.6.0

创建链接

代码语言:javascript
复制
 ls /opt/node-v6.11.3-linux-x64/bin/redis-dump
sudo ln -s /opt/node-v6.11.3-linux-x64/bin/redis-dump /usr/local/bin/redis-dump

0x03 应用Redis-Dump

备份

可以直接dump整个数据库

代码语言:javascript
复制
redis-dump -h your_ip -p your_port -a your_password > 1.json

恢复

< db_full.json redis-load -u :your_password@your_ip:your_password

失败情况

代码语言:javascript
复制
也遇到过dump失败情况
redis-dump -h your_id -p your_port -a your_password > 1.json
Invalid string length
node_redis: Using .end() without the flush parameter is deprecated and throws from v.3.0.0 on.
Please check the doku (https://github.com/NodeRedis/node_redis) and explictly use flush.

修改dump.js的源码,但是会导致redis-dump命令不可用,估计是什么保护机制吧

可以用filter参数,即导出特定的key,举例如下:

代码语言:javascript
复制
redis-dump -h your_id -p your_port -a your_password -f '*counter*' > 1.json

0x04 管道命令

使用例子

generate_redis_commands_option.py 用来构建测试命令

代码语言:javascript
复制
#!/usr/bin/python
import uuid
import hashlib
import time

def create_uuid():   #Via UUID
    return str(uuid.uuid1())

for i in range(100000):
    print 'set options:test_'+create_uuid(),create_uuid()

generate_redis_data.sh将这些命令转化成Redis Protocol

代码语言:javascript
复制
#!/bin/bash

while read CMD; do
  # each command begins with *{number arguments in command}\r\n
  XS=($CMD); printf "*${#XS[@]}\r\n"
  # for each argument, we append ${length}\r\n{argument}\r\n
  for X in $CMD; do printf "\$${#X}\r\n$X\r\n"; done
done < redis_commands.txt

如何使用

代码语言:javascript
复制
python generate_redis_commands_option.py > redis_commands.txt
sh generate_redis_data.sh > redis_data.txt
head -7 redis_data.txt
cat redis_data.txt | redis-cli -p your_port -h your_ip -a your_password --pipe

验证

代码语言:javascript
复制
keys "*option*"

从MySQL迁移

代码语言:javascript
复制
#!/bin/bash  
mysql_cmd=/opt/lampstack-5.5.30-1/mysql/bin/mysql
redis_cmd=/opt/redis/redis-3.0.5/src/redis-cli
mysql_host=your_ip
mysql_user=your_user  
mysql_pwd=your_password
database=your_database  
redis=
cur_dt="$1"    

table_list=$($mysql_cmd -h$mysql_host -u$mysql_user -p$mysql_pwd $database -A -Bse "show tables")   
  
function gen_sql()  
{  
  src_tbl=$1  
  mysql2redis="
SELECT CONCAT(\
 '*3\r\n',\
 '$',\
 LENGTH(redis_cmd), '\r\n',redis_cmd, '\r\n',\
 '$', LENGTH(hkey), '\r\n', hkey, '\r\n',\
 '$', LENGTH(hval), '\r\n', hval, '\r'\
)\
 FROM (\
 SELECT\
 'set' AS redis_cmd,\
 CONCAT('shop:',shopid) AS hkey,\
 deals AS hval\
 FROM $src_tbl\
) AS T"

  echo "$mysql2redis"  
}  
  
arg=xxxx
mysql2redisCmd=$(gen_sql $arg)  
echo $mysql2redisCmd | $mysql_cmd -u$mysql_user -p$mysql_pwd -h$mysql_host $database --skip-column-names --raw | $redis_cmd --pipe

0xFF 参考

如何高效地向Redis插入大量的数据

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • [记录点滴] 使用工具和命令对redis数据进行备份恢复
    • 0x00 摘要
      • 0x01 简介
        • 0x02 安装Redis-Dump
          • node
          • Redis-Dump
        • 0x03 应用Redis-Dump
          • 备份
          • 恢复
          • 失败情况
        • 0x04 管道命令
          • 使用例子
          • 从MySQL迁移
        • 0xFF 参考
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档