Redis7降级6备份不过期数据操作

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。---------失败

好了以上三种方式浪费了大半天时间,文件不兼容是早就知道的事情。换个思路。因为数据量比较小。只考虑备份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; do
    TTL=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW ttl $KEY)
    # 使用整数比较
    if [ "$TTL" -eq -1 ]; then
        TYPE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW type $KEY)
        VALUE=""
        if [ "$TYPE" = "string" ]; then
            VALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw get $KEY)
        elif [ "$TYPE" = "set" ]; then
            MEMBERS=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw smembers $KEY)
            for MEMBER in $MEMBERS; do
	DECODED_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"
            done
        elif [ "$TYPE" = "list" ]; then
            VALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw lrange $KEY 0 -1)
        elif [ "$TYPE" = "hash" ]; then
            VALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw hgetall $KEY)
        elif [ "$TYPE" = "zset" ]; then
            VALUE=$(docker exec $REDIS1_CONTAINER redis-cli -h $REDIS1_HOST -p $REDIS1_PORT -a $REDIS1_PW --raw zrange $KEY 0 -1 withscores)
        fi

        if [ -n "$VALUE" ]; then
            echo "Redis1 Key: $KEY, Value: $VALUE"
            # 在 Docker Redis2 中执行对应的命令
            if [ "$TYPE" = "string" ]; then
                docker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW set $KEY "$VALUE"
            elif [ "$TYPE" = "list" ]; then
                docker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW rpush $KEY "${VALUE[@]}"
            elif [ "$TYPE" = "hash" ]; then
                docker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW hmset $KEY "${VALUE[@]}"
            elif [ "$TYPE" = "zset" ]; then
                docker exec $REDIS2_CONTAINER redis-cli -h $REDIS2_HOST -p $REDIS2_PORT -a $REDIS2_PW zadd $KEY "${VALUE[@]}"
            fi
            echo "Redis2 Key: $KEY, Value: $VALUE"
        fi
    fi
done

echo "Data synchronization complete."


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
降级 Redis 之前,建议您备份 Redis 数据以避免数据丢失。下面是备份 Redis 数据的步骤: 1. 使用 Redis 的 bgsave 命令创建快照文件。打开 Redis 命令行界面,输入以下命令: ``` redis-cli 127.0.0.1:6379> BGSAVE ``` 2. Redis 将在后台创建一个快照文件。您可以使用 LASTSAVE 命令来查看上一次创建快照的时间: ``` 127.0.0.1:6379> LASTSAVE ``` 3. 复制 Redis 的快照文件。在上一步中,您可以看到 Redis 快照文件的创建时间。找到快照文件并复制到其他目录或服务器。 4. 验证 Redis 快照文件是否可以正常恢复。您可以使用以下命令来验证: ``` redis-cli -h <hostname> -p <port> --rdb /path/to/dump.rdb ``` 其中,`<hostname>` 和 `<port>` 分别是 Redis 服务器的主机名和端口号。`/path/to/dump.rdb` 是您刚刚复制的快照文件的路径。 如果 Redis 快照文件可以正常恢复,那么您可以安全地降级 Redis 版本了。在降级完成后,使用 Redis 的 LOAD 命令将快照文件的数据重新加载到 Redis 中: ``` 127.0.0.1:6379> CONFIG SET dir /path/to/redis-data 127.0.0.1:6379> CONFIG SET dbfilename dump.rdb 127.0.0.1:6379> SHUTDOWN ``` 其中,`/path/to/redis-data` 是 Redis 数据文件的目录,`dump.rdb` 是您复制的快照文件名。在使用 CONFIG SET 命令设置 Redis 目录和文件名之后,使用 SHUTDOWN 命令关闭 Redis 服务器。重新启动 Redis 后,它将自动加载快照文件中的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值