redis-check-rdb和redis-check-aof是唯二可信的离线校验工具:前者验证RDB文件魔数、校验和及结构合法性,后者解析AOF全部命令并支持末尾截断修复,但二者均不保证运行时恢复成功。

备份文件存在 ≠ 能用。很多线上故障发生在“以为有备份”,结果恢复时发现文件损坏、校验失败或根本无法加载。
redis-check-rdb 和 redis-check-aof 是唯二可信的校验入口
Redis 不提供“一键验证备份是否能恢复”的命令,但提供了两个专用校验工具,它们直接复用 Redis 内部解析逻辑,比任何外部 MD5 或文件大小检查都可靠:
-
redis-check-rdb只校验 RDB 文件头部魔数(REDIS)、校验和(checksum)及基本结构,不加载数据;成功返回 0 表示文件格式合法、未被截断或乱码 -
redis-check-aof默认会尝试解析 AOF 文件全部命令;若末尾有不完整命令(如宕机导致*3\r\n$3\r\nSET\r\n$4\r\nkey1\r\n缺少 value),在aof-load-truncated yes下会警告并截断,但--fix才真正修复——注意:它只修复末尾破损,不修复中间乱码 - 二者都不依赖 Redis 进程运行,可离线执行;建议在备份生成后立即调用,而非等到灾备时才跑
- 若文件是 gzip 压缩的(如
dump.rdb.gz),必须先解压再校验,redis-check-rdb不识别压缩包
校验通过 ≠ 恢复成功,必须做轻量级恢复演练
校验只是语法正确性检查,无法覆盖内存限制、配置冲突、模块兼容性等运行时问题。真实恢复失败常出现在这些地方:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 备份生成时用了 Redis 7.2,但恢复环境是 6.2 —— RDB 版本不兼容会静默失败或加载部分数据;用
redis-check-rdb --version查看源版本,对比目标实例redis-server --version - AOF 文件里有
MODULE LOAD命令,但恢复环境没装对应模块,Redis 启动直接报错退出;需确保模块路径、so 文件版本一致 - RDB 文件含大量大 key(如 500MB 的 hash),而恢复机器内存不足,
redis-server启动卡住或 OOM;可在低配临时实例中用--maxmemory 2g试跑 - 混合持久化(
aof-use-rdb-preamble yes)的 AOF 文件,redis-check-aof只校验 AOF 段,RDB 段仍需单独用redis-check-rdb校验开头部分
自动化脚本里最容易漏掉的三个检查点
写监控脚本时,90% 的人只 check 文件是否存在和 size > 0,但以下三点才是真瓶颈:
- 时间戳连续性:AOF 备份应每小时生成一次,但若某次重写失败,后续 AOF 会持续追加变大;仅靠
find -mmin -60不够,要检查ls -lt appendonly.aof.* | head -2看最近两个文件间隔是否超 65 分钟 - RDB 的
stop-writes-on-bgsave-error yes配置下,若磁盘满导致上次BGSAVE失败,Redis 会拒绝写入,但备份脚本可能还在“正常”生成空文件;需同步检查 Redis 日志是否有Failed writing the RDB file - 校验命令的 exit code 必须显式判断:
redis-check-rdb dump.rdb &>/dev/null || echo "corrupted"不行,因为它的错误输出走 stderr,且成功时也可能打印 warning;要用if ! redis-check-rdb dump.rdb >/dev/null 2>&1; then ...
最危险的错觉,是把 redis-check-rdb 返回 0 当作“这个备份明天一定能救活生产库”。它只说明文件没坏,不说明你的恢复流程跑得通、权限对、磁盘够、模块齐——真正的可用性,永远在一次最小闭环的 restore 测试之后。

















