Redis从AOF迁移至RDB遇数据丢失,求正确迁移方案
我来帮你解决这个迁移问题——你之前遇到的重启丢数据情况,本质是因为当时你的RDB文件并非最新状态(甚至可能是空的),关闭AOF后Redis只能加载旧的RDB,自然就找不到数据了。下面是经过验证的安全迁移步骤:
步骤1:确认当前Redis实例数据完整
先确保你的Redis在AOF模式下运行正常,数据没有丢失。可以用INFO keyspace查看键的统计情况,或者通过业务相关的命令验证核心数据存在,避免迁移前就有数据问题。
步骤2:手动生成最新的RDB文件
在Redis命令行执行持久化命令,把当前内存中的所有数据写入RDB文件:
# 阻塞式持久化(适合低峰期) SAVE # 或后台异步持久化(不影响主进程,推荐日常使用) BGSAVE
执行完成后,用INFO persistence查看rdb_last_save_time,确认RDB文件已经更新为最新状态。这一步是迁移的核心,保证后续切换到RDB模式时有完整的数据文件可加载。
步骤3:切换为仅RDB持久化模式
方式一:修改配置文件(推荐,永久生效)
找到Redis的配置文件(通常是redis.conf),修改以下配置项:
# 禁用AOF持久化 appendonly no # 确认RDB自动触发规则开启(默认已开启,无需修改,仅做校验) save 900 1 save 300 10 save 60 10000
这些save规则是Redis自动触发RDB的条件,默认配置下会在满足条件时自动生成RDB,保持默认即可。
方式二:命令行参数临时切换
如果不想修改配置文件,也可以通过启动参数临时禁用AOF:
redis-server --appendonly no
注意:这种方式下,下次重启Redis时需要再次指定该参数,否则会回到配置文件的设置。
步骤4:验证迁移后的数据完整性
重启Redis实例后,再次用INFO keyspace或业务命令检查数据是否完整。此时Redis会加载刚生成的最新RDB文件,数据应该和AOF模式下完全一致。
补充:为什么你之前的操作会丢失数据?
你之前直接用--appendonly no重启时,你的RDB文件可能还是很久之前生成的,甚至从未触发过自动持久化(比如实例运行时间短,没达到默认的RDB触发条件)。关闭AOF后,Redis只能加载旧的/空的RDB文件,所以数据丢失;而切回AOF模式时,Redis加载了完整的AOF日志,数据自然就恢复了。
内容的提问来源于stack exchange,提问作者Jethro

