[记录点滴] 使用工具和命令对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}\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

如何使用

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(\
'*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插入大量的数据

[记录点滴] 使用工具和命令对redis数据进行备份恢复的更多相关文章

  1. Oracle RAC 常用维护工具和命令

    Oracle RAC 常用维护工具和命令 分类: Oracle Basic Knowledge Oracle RAC2010-03-09 01:02 13987人阅读 评论(6) 收藏 举报 orac ...

  2. RAC 常用维护工具和命令(oracle 10g)

    Oracle 的管理可以通过OEM或者命令行接口. Oracle Clusterware的命令集可以分为以下4种: 节点层:osnodes 网络层:oifcfg 集群层:crsctl, ocrchec ...

  3. Redis学习笔记(5)——Redis数据持久化

    出处http://www.cnblogs.com/xiaoxi/p/7065328.html 一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存 ...

  4. redis开启持久化、redis 数据备份与恢复

    redis持久化介绍  https://segmentfault.com/a/1190000015897415 1. 开启aof持久化.以守护进程启动.远程访问先把配置文件拷贝一份到/etc/redi ...

  5. redis入门指南(七)—— 安全、协议、管理工具及命令属性

    写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 安全 1.可以使用bind参数绑定一个地址,使redis只接受这个地址的连接. 2.使用requ ...

  6. [记录点滴]授人以渔,从Tensorflow找不到dll扩展到如何排查问题

    [记录点滴]授人以渔,从Tensorflow找不到dll扩展到如何排查问题 目录 [记录点滴]授人以渔,从Tensorflow找不到dll扩展到如何排查问题 0x00 摘要 0x01 引言 0x02 ...

  7. Redis数据导入工具优化过程总结

    Redis数据导入工具优化过程总结 背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻 ...

  8. 使用info命令查看Redis信息和状态

    redis-cli连接服务器后,使用info命令查看Redis信息和状态: ? 1 info 其中memory段显示了redis的内存使用状态. 以下内容复制自:http://redisdoc.com ...

  9. linux网络开发者定位问题常用工具和命令总结

    本文章来自我的微信个人技术公众号---网络技术修炼,公众号中总结普及网络基础知识,包括基础原理.网络方案.开发经验和问题定位案例等,欢迎关注. Linux网络开发者面临的问题往往比较复杂,因此需要使用 ...

  10. 记录一下git 的常用命令

    以后如果要写一个东西,最好先搭建一个本地仓库,用版本控制对其进行操作,可能一开始有一些麻烦,但是很有可能会受益无穷. 说到git,必然会和github联系起来. 不管是在ubuntu里面还是在Wind ...

随机推荐

  1. nginx之常见错误

    在此只介绍源码安装nginx的时候,发生的一些常见的错误 1. nginx访问出现File not found 1) php-fpm找不到SCRIPT_FILENAME中执行的PHP文件 更改配置文件 ...

  2. Mac下的终端高亮显示

    默认安装之后Mac下的终端都是一色的黑白,所以需要做一番改造 推荐安装Linux使用的GNU Coreutils替换Mac的ls命令,因为: Coreutils提供了配置工具,定义颜色代码更加方便: ...

  3. fastadmin-表格使用

    1.弹窗页面大小 <div id="toolbar" class="toolbar"> <a data-area='["90%&qu ...

  4. Javascript 粘贴板

    1.前言 本节讲述如何封装一个操作粘贴板的方法 原理:选中某个Dom元素(比如文本域),执行区域复制命令即可. 相关API:document.execCommand():该方法允许运行命令来操纵可编辑 ...

  5. px2rem 实现vue rem 自适应/

    npm install postcss-px2rem px2rem-loader --save 新建js 文件rem.js // rem等比适配配置文件 // 基准大小 const baseSize ...

  6. StarBlog博客Vue前端开发笔记:(2)页面路由

    前言 Vue.js 使用虚拟 DOM 处理单页面,然后使用 Webpack 打包.通过上一篇文章的例子,读者也许已经发现,无论语法和写法如何不同,Vue.js 程序打包后都是一个单一的 HTML 文件 ...

  7. 调用xlst执行转换

    try { //Create a new XslTransform object. XslCompiledTransform xslt = new XslCompiledTransform(); // ...

  8. Linux下TCP/IP编程--TCP实战

    之前尝试过windows下的简单TCP客户端服务器编写,这次尝试下一下Linux环境下的TCP 客户端代码 #include <stdio.h> #include <stdlib.h ...

  9. 《Kubernetes故障篇:calico/node is not ready: BIRD is not ready》

    文章目录一.背景信息二.解决方法总结:整理不易,如果对你有帮助,可否点赞关注一下? 一.背景信息k8s集群部署后发现calico的pod未通过健康检查,如下所示: 通过命令kubectl descri ...

  10. 设置VirtualBox共享文件夹的方法

    1.创建共享文件夹进入linux终端,通过如下指令创建共享文件夹.在此处的/mnt/share是Linux下的共享文件夹. sudo mkdir /mnt/share2.在VirtualBox的设置中 ...