Linux&Redis&MySQL文件恢复

113 阅读3分钟

Linux文件恢复case

Superblock,它包含了整个文件系统的metadata,具体有:

  • inode/data block 总量、使用量、剩余量。

  • 文件系统的格式,属主等等各种属性。

Superblock对于文件系统来说非常重要,如果Superblock损坏了,文件系统就挂载不了了,相应的文件也没办法读写。

既然Superblock这么重要,那肯定不能只有一份,坏了就没了,它在系统中是有很多副本的,在Superblock损坏的时候,可以使用fsck(File System Check and repair)来恢复。

Redis文件恢复 case

Redis 为了提升可靠性,可以使用 AOF 记录操作日志,或者使用 RDB 保存数据库镜像。AOF 文件的记录和 RDB 文件的保存都涉及写盘操作,但是,如果在写盘过程中发生了错误,就会导致 AOF 或 RDB 文件不完整。而 Redis 使用不完整的 AOF 或 RDB 文件,是无法恢复数据库的。那么在这种情况下,我们该怎么处理呢?

AOF 文件检测与修复

AOF 文件记录的是 Redis server 运行时收到的操作命令。当 Redis server 往 AOF 文件中写入命令时,它会按照 RESP 2 协议的格式来记录每一条命令。当然,如果你使用了 Redis 6.0 版本,那么 Redis 会采用 RESP 3 协议。

因为 RESP 2 协议会将命令参数个数、字符串长度这些信息,通过编码也记录到 AOF 文件中,redis-check-aof 命令在检测 AOF 文件时,就可以利用这些信息来判断一个命令是否完整记录了。

AOF 文件的检测过程

AOF 文件的检测是在 redis-check-aof.c 文件中实现的,这个文件的入口函数是 redis_check_aof_main。在这个函数中,我们可以看到 AOF 检测的主要逻辑,简单来说可以分成三步。

首先,redis_check_aof_main 会调用 fopen 函数打开 AOF 文件,并调用 redis_fstat 函数获取 AOF 文件的大小 size。

其次,redis_check_aof_main 会调用 process 函数,实际检测 AOF 文件。process 函数会读取 AOF 文件中的每一行,并检测是否正确,我一会儿会给你具体介绍这个函数。这里你要知道,process 函数在检测 AOF 文件时,如果发现有不正确或是不完整的命令操作,它就会停止执行,并且返回已经检测为正确的 AOF 文件位置。

最后,redis_check_aof_main 会根据 process 函数的返回值,来判断已经检测为正确的文件大小是否等于 AOF 文件本身大小。如果不等于的话,redis_check_aof_main 函数会根据 redis-check-aof 命令执行时的 fix 选项,来决定是否进行修复。

一个小建议,当你使用 redis-check-aof 命令修复 AOF 文件时,最好是把原来的 AOF 文件备份一份,以免出现修复后原始 AOF 文件被截断,而带来的操作命令缺失问题。

RDB 文件检测

redis_check_rdb 函数检测 RDB 文件的逻辑比较简单,就是根据 RDB 文件的组成,逐一检测文件头的魔数、文件头中的属性信息、文件中的键值对数据,以及最后的文件尾校验和。

这样,在判断完操作码之后,redis_check_rdb 函数就会调用 rdbLoadStringObject 函数,读取键值对的 key,以及调用 rdbLoadObject 函数读取键值对的 value。最后,当读取完所有的键值对后,redis_check_rdb 函数就会读取文件尾的校验和信息,然后验证校验和是否正确。

到这里,整个 RDB 文件的检测就完成了。在这个过程中,如果 redis_check_rdb 函数发现 RDB 文件有错误,就会将错误在文件中出现的位置、当前的检测操作、检测的键值对的 key 等信息打印出来,以便我们自行进一步检查。