• [记录点滴] 使用工具和命令对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}
    
      XS=($CMD); printf "*${#XS[@]}
    "
      # for each argument, we append ${length}
    {argument}
    
      for X in $CMD; do printf "$${#X}
    $X
    "; 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
    ',
     '$',
     LENGTH(redis_cmd), '
    ',redis_cmd, '
    ',
     '$', LENGTH(hkey), '
    ', hkey, '
    ',
     '$', LENGTH(hval), '
    ', hval, '
    '
    )
     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插入大量的数据

  • 相关阅读:
    VSCode多文件编译执行
    python当函数赋给变量时带括号与不带括号的区别
    VS添加现有的文件夹到项目中
    pythonpython中a=a+b与a+=b的区别
    android创建无界面的服务运行在后台
    androidService_Intent_must_be_explicit的解决方法
    VSCode配置c_cpp环境
    VSCode切换焦点时自动保存文件
    Gradle动态移除清单文件中的权限
    C++多线程
  • 原文地址:https://www.cnblogs.com/rossiXYZ/p/13197425.html
Copyright © 2020-2023  润新知