验证快照文件和AOF文件
无论是快照持久化还是AOF持久化,都提供了在遇到系统故障时进行数据恢复的工作。Redis提供了两个命令行程序redis-check-aof 和redis-check-dump,他们可以在系统故障发生之后,检查AOF文件和快照文件的状态,并在有需要的情况下对文件进行修复。在不给定任何参数的情况下运行这两个程序,就可以看见他们的基本使用方法:
$ redis-check-aof
Usage:redis-check-of [--fix] <file.aof>
$redis-check-dump
Usage:redis-check-dump <dump.rdb>
如果用户在运行redis-check-aof程序时给定了--fix参数,那么程序将对AOF文件进行修复。程序修复AOF文件的方法非常简单,它会扫描给定的AOF文件,寻找不正确或者不完整的命令,当发现第一个出错命令的时候,程序会删除出错的命令以及位于出错命令之后的所有的命令,只保留那些位于出错命令之前的正确命令。在大多数情况下,被删除的都是AOF文件末尾的不完整的写命令。
遗憾的是,目前并没有方法可以修复出错的快照文件。尽管发现快照文件首个出现错误的地方是有可能的,但因为快照文件本身经过了压缩,而出现在快照文件中间的错误有可能会导致快照文件的剩余部分无法被读取。因此,用户最好为重要的快照文件保留多个备份,并在进行数据恢复时,通过计算快照文件的sha1散列值和SHA256散列值来对内容进行验证。(当今的Linux平台和Unix平台都包含类似sha1sum和sha256sum这样的用于生成和验证散列值的命令行程序。)
加载损坏的AOF文件时会拒绝启动, 并打印如下日志:
# Bad file format reading the append only file: make a backup of your AOF file,
then use ./redis-check-aof --fix <filename>
运维提示:
对于错误格式的AOF文件, 先进行备份, 然后采用redis-check-aof--fix命令进行修复, 修复后使用diff-u对比数据的差异, 找出丢失的数据, 有些可以人工修改补全。
AOF文件可能存在结尾不完整的情况, 比如机器突然掉电导致AOF尾部文件命令写入不全。 Redis为我们提供了aof-load-truncated配置来兼容这种情况, 默认开启。 加载AOF时, 当遇到此问题时会忽略并继续启动, 同时打印如下警告日志:
# !!! Warning: short read while loading the AOF file !!!
# !!! Truncating the AOF at offset 397856725 !!!
# AOF loaded anyway because aof-load-truncated is enabled