redis 数据迁移 restore

本文介绍了一款用于Redis数据库的数据迁移脚本,该脚本能将指定Redis实例中除0号库外的所有数据库数据迁移到0号库。脚本通过遍历各数据库,获取所有键值并检查其过期时间,然后利用RAW DUMP和RESTORE命令实现数据迁移,同时记录迁移过程的日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/bin/bash
#redis数据迁移脚本,将其他库的数据迁移到0号库
ip='localhost'
port=6379
dest_db=0

for ((db=1;db<16;db++))
do
    redis-cli -h $ip -p $port  -n $db keys "*" | while read key
    do
      if [ -n "$key" ];
      then
        redis-cli -h $ip -p $port  -n $db ttl $key | while read k
        do
          if [ $k -gt -1 ];
          then
            redis-cli -h $ip -p $port  -n $db --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h $ip -p $port -n $dest_db -x restore $key $((k*1000))
            echo "[$(date "+%Y-%m-%d %H:%M:%S")]  migrate key $key from db$db to db$dest_db ttl is $k" >> migrate-redis.log
          else
            redis-cli -h $ip -p $port  -n $db --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h $ip -p $port -n $dest_db -x restore $key 0
            echo "[$(date "+%Y-%m-%d %H:%M:%S")]  migrate key $key from db$db to db$dest_db"  >> migrate-redis.log
          fi
        done
      fi
    done
done

### Redis 数据迁移方法 #### 方法一:离线迁移 离线迁移主要依赖于 RDB 或者 AOF 文件来进行操作。对于 **RDB 方式** 来说,其特点是速度快,但是要求目的库必须处于关闭状态以便加载新数据[^4]。 ```bash # 源库执行BGSAVE命令生成最新的持久化文件 redis-cli bgsave # 将源库的rdb文件复制到目标库所在位置 cp /path/to/source/dump.rdb /path/to/target/ # 启动或重启目标库使新的数据生效 service redis-server restart ``` 而使用 **AOF 方式** 进行迁移则相对较为缓慢,不过可以确保更完整的数据记录。需要注意的是,这种方式下源库和目的库都需要支持 AOF 功能,并且可以通过特定命令直接导入AOF日志流。 ```bash # 使用管道命令将AOF文件内容发送给目标实例 cat appendonly.aof | redis-cli --pipe -h target_host -p target_port ``` #### 方法二:在线迁移-Sync模式 此模式利用了Redis自身的主从复制机制实现数据传输。它会先进行一次全量的数据同步,之后再持续不断地把发生在原服务器上的任何更改实时转发给接收方直到整个过程结束[^2]。 #### 方法三:在线迁移-Scan模式 该方案适用于希望减少对现有业务影响的情况。通过遍历所有键空间并逐个处理各个条目从而达到转移效果;具体来说就是运用 `SCAN` 命令配合 `DUMP/RESTORE` API 完成跨环境间对象级别的搬运工作。 ```python import redis source_db = redis.StrictRedis(host='localhost', port=6379, db=0) target_db = redis.StrictRedis(host='remote_host', port=6379, db=0) for key in source_db.scan_iter(): ttl = source_db.ttl(key) value = source_db.dump(key) if value is not None: try: target_db.restore(key, ttl * 1000 or 0, value) except Exception as e: print(f"Failed to restore {key}: ", str(e)) ``` ### 工具推荐 为了简化上述流程以及提高效率,可以选择专业的第三方工具如 RedisShake 等辅助完成复杂的场景下的迁移任务。这类软件通常具备更好的性能表现及更多的高级特性支持,比如不同版本间的兼容性检测等功能[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值