Redis7降级6备份不过期数据操作
搜到三种备份方法
- rdb版本11-》redis7;rdb版本9-》redis6;不兼容,版本太高无第三方工具转换。其中那个rdbtool白瞎断更好久了。
- aof 使用aof -fix,文件大小没变,读取不了数据;不兼容,版本太高无第三方工具转换。找不到第三方工具,可能国内环境吧。
- 使用redis-dump,需要ruby环境,ruby高版本在linux需要rvm,究极难安装,可能是虚拟机环境问题吧,其他服务器没有尝试,感觉是网络原因。尝试安装失败;windows安装成功ruby成功,redis-dump执行失败,不支持winodw远程连接redis,牛比plus。---------失败
redisttl_8">好了以上三种方式浪费了大半天时间,文件不兼容是早就知道的事情。换个思路。因为数据量比较小。只考虑备份redis中ttl数据,其他数据不重要。
- lua脚本cjson encode导出redis数据到json文件,导出成功后,cjson的decode无法导入,奇葩。脚本是ok的。估计是json格式或者数据编码的问题,而且lua脚本中require在redis容器里还有限制使用。。。---------失败
新建思路: 需要将redis7降级,新增redis6容器,端口号、挂载目录、容器名称区分开,其他不变,开启aof哦。首选bash,,python要装环境,,服务器也不是随便乱动的地方,唉,巧妇难为无米之炊。
前提:非正式环境!自己考虑正式环境就别降级了,数据参差不齐的。
就是进入redis7容器内部, 查找所有key,取ttl=-1的key进行操作,赋值给变量后,火速到redis6的容器内部,进行set操作。一共20条数据哈。此时,redis6的data目录下的aof和rdb就是新鲜的20条数据的低版本文件了。
docker stop redis7。直接将上一步redis6的aof和rdb放到redis7下,,修改redis7的镜像号,compose即可。重建容器后,里边就只剩下ttl=-1的数据了。
更换脚本了哈,有一些值的特殊字符问题,特殊处理,自己看着搜索吧。
gpt帮助的脚本内容。SET命令后不需要添加EX -1
#!/bin/bash# Docker Redis1 连接信息
REDIS1_CONTAINER="redis7"
REDIS1_HOST=host
REDIS1_PORT=63179
REDIS1_PW=xx# Docker Redis2 连接信息
REDIS2_CONTAINER="redis6"
REDIS2_HOST=host
REDIS2_PORT=63279
REDIS2_PW=xx# 在 Docker Redis1 中查询所有 ttl=-1 的键值对和过期时间
KEYS=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw keys '*')
for KEY in $KEYS; doTTL=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW ttl $KEY)# 使用整数比较if [ "$TTL" -eq -1 ]; thenTYPE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW type $KEY)VALUE=""if [ "$TYPE" = "string" ]; thenVALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw get $KEY)elif [ "$TYPE" = "set" ]; thenMEMBERS=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw smembers $KEY)for MEMBER in $MEMBERS; doDECODED_MEMBER=$(echo -n "$MEMBER" | awk -F 'did:' '{print "did:"$2}' | iconv -f ISO-8859-1 -t UTF-8)echo "Redis1 Key: $KEY, DECODED_MEMBER: $DECODED_MEMBER"# 在 Docker Redis2 中执行对应的命令docker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW sadd $KEY "$DECODED_MEMBER"doneelif [ "$TYPE" = "list" ]; thenVALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw lrange $KEY 0 -1)elif [ "$TYPE" = "hash" ]; thenVALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw hgetall $KEY)elif [ "$TYPE" = "zset" ]; thenVALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw zrange $KEY 0 -1 withscores)fiif [ -n "$VALUE" ]; thenecho "Redis1 Key: $KEY, Value: $VALUE"# 在 Docker Redis2 中执行对应的命令if [ "$TYPE" = "string" ]; thendocker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW set $KEY "$VALUE"elif [ "$TYPE" = "list" ]; thendocker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW rpush $KEY "${VALUE[@]}"elif [ "$TYPE" = "hash" ]; thendocker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW hmset $KEY "${VALUE[@]}"elif [ "$TYPE" = "zset" ]; thendocker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW zadd $KEY "${VALUE[@]}"fiecho "Redis2 Key: $KEY, Value: $VALUE"fifi
doneecho "Data synchronization complete."