redis主备同步非常方便,通过slaveof命令即可同步。上周应用切换了redis,想让新的redis和旧的redis进行数据同步,结果把新redis中其他应用已经写入的所有数据都删除了。。。这里记录下恢复方法。 首先先恢复redis的dump文件。还好现在阿里云弹性计算集群给
redis主备同步非常方便,通过slaveof命令即可同步。上周应用切换了redis,想让新的redis和旧的redis进行数据同步,结果把新redis中其他应用已经写入的所有数据都删除了。。。这里记录下恢复方法。
首先先恢复redis的dump文件。还好现在阿里云弹性计算集群给每个镜像每天都进行了备份,通过操作前一天的备份镜像,快照制作当时的整个redis目录复制了出来,作为恢复的基础。
然后将恢复回来的文件再复制一份备份,原先那份修改redis的配置文件,修改启动端口(我从默认的6379改成了6479),然后启动旧的redis,成功将当时的dump文件载入到新的redis实例中。
查询到redis有migrate命令,能够将key迁移到另外一个redis实例中(具体参考这里)。通过bash命令,循环的将备份的实例所有key,都试图通过migrate命令迁移到新的redis中。
迁移过程中,迁移成功的key,在旧的实例中会被删除,失败的key,可以看见失败原因都是key is busy。也就是说,要迁移的key在新的实例中已经存在了。
和使用方确定了所有已经存在的key,是hash类型的,都是要保留的数据。因此,通过一个简单的shell脚本,读取备份实例中hash类型key,并添加到新的redis中。bash脚本为:
#!/bin/bash OLD_REDIS=\"./redis-cli -p 6479\" NEW_REDIS=\"./redis-cli\" KEYS=`$OLD_REDIS keys \'*\'` for k in $KEYS do key_type=`$OLD_REDIS type $k` if [ $key_type = \"hash\" ]; then hash_keys=`$OLD_REDIS HKEYS $k` for hash_key in $hash_keys do hash_value=`$OLD_REDIS HGET $k $hash_key` $NEW_REDIS HSET $k $hash_key $hash_value echo \"merge $k $hash_key to new redis\" done #eval \"$OLD_REDIS DEL $k\" fi done