redis-check-aof 的用途
redis-check-aof 是随 Redis 一起发布的 AOF 校验与修复工具:不加参数时它只读地逐条解析 AOF 里的命令,确认格式完整、能被重新执行,并给出解析到哪个字节位置为止;加 --fix 时它会把文件截断到最后一个完整命令处并重写,丢弃尾部残缺的字节。它解决的是「AOF 尾部写坏导致实例起不来」这一类问题,但对中间位置的损坏同样只能截断,损坏点之后的全部数据都会消失,因此它本质上是止损工具而不是数据恢复工具。
基本信息
| 只读校验 | redis-check-aof <aof 文件路径> |
|---|---|
| 修复模式 | redis-check-aof --fix <aof 文件路径> |
| 配套工具 | redis-check-rdb 用于校验 RDB 文件,用法类似 |
| 前置条件 | 先停掉对应实例,并先复制一份原始文件 |
| 修复语义 | 截断到最后一个完整命令,之后的内容全部丢弃 |
| 多文件结构 | Redis 7 起 AOF 由 manifest 组织为多个文件,要按 manifest 引用的对象处理 |
典型使用场景
- 实例启动报 AOF 格式错误或文件意外结束时做抢救,让服务先起来
- 断电、磁盘写满、容器被强制杀掉之后检查 AOF 完整性
- 恢复演练:拿一份副本走一遍校验与修复流程,确认耗时与数据损失量
- 升级前预检:确认现有 AOF 能被新版本正常加载
- 变更前留底:评估文件尾部是否恰好停在半条命令上
安全修复流程
安全修复流程
sudo systemctl stop redis # 1 先停实例,避免边写边修
cp -a /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.bak # 2 备份原文件
redis-check-aof /var/lib/redis/appendonly.aof # 3 只校验,不改动文件
redis-check-aof --fix /var/lib/redis/appendonly.aof # 4 截断到最后一个完整命令
sudo systemctl start redis # 5 启动并看日志是否还有 AOF 报错
redis-cli INFO persistence | grep -E 'aof_last_write_status|aof_enabled'
redis-cli DBSIZE # 6 与业务侧记录核对规模校验与修复对照
| 维度 | 不加 --fix | 加 --fix |
|---|---|---|
| 文件修改 | 不改动,纯读取 | 截断并重写文件 |
| 尾部残破命令 | 报告位置并给出结论 | 丢弃残破部分,保留之前内容 |
| 中间位置损坏 | 报错指出位置 | 同样只能截断到损坏点之前 |
| 适用前提 | 任何时刻都可执行 | 实例已停、原文件已备份 |
| 结果验证 | 看解析结论与字节位置 | 启动后核对 DBSIZE 与业务数据 |
校验输出会给出分析到的字节位置与文件总大小,两者之差就是尾部会被丢弃的量;如果解析位置离文件末尾很近,说明只有最后一次写入没落全,损失很小;如果解析位置远小于文件大小,说明损坏点很靠前,修复后的数据规模会明显缩水,此时更应考虑直接回退到可用备份。
--fix 是不可逆的截断操作。必须先停实例、先备份,并在副本上验证流程后再对正式文件动手。对唯一一份且没有备份的 AOF 直接执行修复,会把一次可控的启动失败扩大成永久的数据丢失。