[记录点滴] 使用工具和命令对redis数据进行备份恢复
时间:2022-07-24
本文章向大家介绍[记录点滴] 使用工具和命令对redis数据进行备份恢复,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
[记录点滴] 使用工具和命令对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中创建该文件的链接
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验证是否成功
node -v
npm -v
Redis-Dump
安装redis-dump
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
创建链接
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整个数据库
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
失败情况
也遇到过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,举例如下:
redis-dump -h your_id -p your_port -a your_password -f '*counter*' > 1.json
0x04 管道命令
使用例子
generate_redis_commands_option.py 用来构建测试命令
#!/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
#!/bin/bash
while read CMD; do
# each command begins with *{number arguments in command}rn
XS=($CMD); printf "*${#XS[@]}rn"
# for each argument, we append ${length}rn{argument}rn
for X in $CMD; do printf "$${#X}rn$Xrn"; done
done < redis_commands.txt
如何使用
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
验证
keys "*option*"
从MySQL迁移
#!/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(
'*3rn',
'$',
LENGTH(redis_cmd), 'rn',redis_cmd, 'rn',
'$', LENGTH(hkey), 'rn', hkey, 'rn',
'$', LENGTH(hval), 'rn', 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 参考
- WordPress 主题开发之激活主题后显示自定义提示信息
- Normalize.css ——CSS Reset的友好替代品
- jQuery Builder:jQuery 库的精简之道
- 数字化的真我
- iOS / Android 移动设备中的 Touch Icons
- 高科技营销的幻觉与惊醒
- 将你的网站打造成一个iOS Web App
- 什么是人?人工智能的发展已经逼迫人类思考这样的问题
- 加法生产
- Web 前端利器Emmet 的HTML用法总结
- Web 前端利器Emmet 的CSS 用法总结
- 响应式 HTML 邮件制作之三个实例
- java知识点归纳
- EaseMobile 主题导航菜单设置小图标的方法(图文+视频教程)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- dotnet 使用 Interlocked 实现一个无锁的快速无序仅写集合
- 利用Python将gff3转换成gtf格式
- 单细胞DoHeatmap画热图标签出界
- FastSpar | 用更快的 SparCC 进行微生物组相关性分析
- GO和KEGG富集倍数(Fold Enrichment)如何计算
- 监控域名HTTPS证书过期时间
- 使用hmmlearn分析股票数据
- Flink源码阅读之Checkpoint执行过程
- 一文了解Kudu的核心原理
- 回归问题的中的常用方法
- 深度优先搜索(DFS)两点之间的可行路径
- docker相关工具
- Dijkstra算法求图中最短路径
- 一文轻松理解内存对齐
- 测试开发之Spring篇(六)