最直接信号是启动日志出现“bad file format reading the append only file”,表明aof协议层损坏(如缺\r\n、开头非*、长度声明不符),redis将中止启动且不回退至rdb;需用同版本redis-check-aof校验,空文件或rdb preamble混淆亦会引发类似问题。

看 Redis 启动日志里有没有 “Bad file format” 报错
这是最直接的信号。Redis 启动时加载 AOF 失败,会明确打印类似这样的错误:
Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename></filename>
只要看到这行,基本可以断定 AOF 文件协议层已损坏(比如缺 \r\n、开头不是 *、参数长度声明和实际内容不匹配)。它不是“文件不存在”,而是“文件存在但解析失败”。
- 该错误出现时,Redis 会 abort 启动,不会 fallback 到 RDB —— 即使 RDB 文件完好也起不来
- 注意:这个报错只在 AOF 文件真实存在且被尝试加载时触发;如果文件压根不在
dir下,Redis 会静默跳过 AOF,转而加载 RDB,不报这个错
用 redis-check-aof 扫描文件结构
redis-check-aof 不是“修完才告诉你坏了”,它先做静态协议校验。运行它就能暴露问题:
redis-check-aof /var/lib/redis/appendonly.aof
正常输出是:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
AOF file is valid
一旦出错,会定位到第一个非法字节偏移,例如:
0x0: Expected prefix '*', got: 'A'<br>AOF analyzed: size=15264718, ok_up_to=13956077, diff=1308641
-
ok_up_to表示前多少字节是合法协议,后面全是废料 - 哪怕只是末尾多了一个空格或截断了半条命令,它都会报错,不依赖 Redis 运行时环境
- 必须用和当前
redis-server版本完全一致的redis-check-aof,否则可能误判模块命令(如JSON.SET)为未知命令
检查 AOF 文件是否为空或零字节
空文件比损坏更危险——它会被 Redis 当作“合法但无操作”的 AOF 加载,结果是清空所有数据,覆盖掉 RDB 里的内容。
- 用
ls -l appendonly.aof看大小,size=0就是空文件 -
touch appendonly.aof后启动 Redis,等同于手动制造这个陷阱 - Redis 启动日志里不会报错,但你会看到
Reading AOF from file然后瞬间加载完成——没警告,没提示,数据就没了
留意混合持久化下的 RDB preamble 干扰
当 aof-use-rdb-preamble yes 开启时,AOF 文件开头是二进制 RDB 格式,后面才是文本协议命令。redis-check-aof 默认不识别 RDB preamble,会直接在头部报错:
0x0: Expected prefix '*', got: 0x52
这里的 0x52 就是 RDB 文件魔数 RDB 的首字节。
- 这不是损坏,是工具不支持 preamble 模式下的完整校验
- 此时不能直接
--fix,否则会把合法 preamble 当垃圾删掉 - 正确做法是:先用
redis-cli config get aof-use-rdb-preamble确认是否开启;若开启,应改用redis-check-rdb验证 preamble 部分,再人工截掉头部、单独处理后续文本段
--fix 重要得多。










