Redis 源码剖析与实战
蒋德钧
中科院计算所副研究员
17747 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
Redis 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

加餐4 | RDB和AOF文件损坏了咋办?

你好,我是蒋德钧。今天的加餐课程,我来和你聊聊 Redis 对损坏的 RDB 和 AOF 文件的处理方法。
我们知道,Redis 为了提升可靠性,可以使用 AOF 记录操作日志,或者使用 RDB 保存数据库镜像。AOF 文件的记录和 RDB 文件的保存都涉及写盘操作,但是,如果在写盘过程中发生了错误,就会导致 AOF 或 RDB 文件不完整。而 Redis 使用不完整的 AOF 或 RDB 文件,是无法恢复数据库的。那么在这种情况下,我们该怎么处理呢?
实际上,Redis 为了应对这个问题,就专门实现了针对 AOF 和 RDB 文件的完整性检测工具,也就是 redis-check-aof 和 redis-check-rdb 两个命令。今天这节课,我就来给你介绍下这两个命令的实现以及它们的作用。学完这节课后,如果你再遇到无法使用 AOF 或 RDB 文件恢复 Redis 数据库时,你就可以试试这两个命令。
接下来,我们先来看下 AOF 文件的检测和修复。

AOF 文件检测与修复

要想掌握 AOF 文件的检测和修复,我们首先需要了解下,AOF 文件的内容格式是怎样的。

AOF 文件的内容格式

AOF 文件记录的是 Redis server 运行时收到的操作命令。当 Redis server 往 AOF 文件中写入命令时,它会按照 RESP 2 协议的格式来记录每一条命令。当然,如果你使用了 Redis 6.0 版本,那么 Redis 会采用 RESP 3 协议。我在第一季的时候,曾经给你介绍过 Redis 客户端和 server 之间进行交互的RESP 2 协议,你可以再去回顾下。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Redis对损坏的RDB和AOF文件的处理方法是通过redis-check-aof和redis-check-rdb两个命令来实现完整性检测。AOF文件的检测和修复主要通过检测RESP 2协议记录的命令格式和调用ftruncate函数执行截断操作来实现。检测过程中,redis-check-aof命令会利用编码结果中的数值来判断命令是否完整记录了,而修复操作则是从AOF文件已经检测正确的位置开始进行截断操作。对于RDB文件的检测,文章未给出具体内容。文章通过介绍AOF文件的内容格式、检测过程和修复方法,帮助读者了解了Redis对损坏的AOF文件的处理方法。 文章还介绍了redis-check-rdb.c文件中的redis_check_rdb_main函数,它通过逐一检测RDB文件的组成部分,包括文件头、键值对数据部分和文件尾,来实现RDB文件的完整性检测。通过读取文件头的魔数和版本号、按照RDB文件的格式依次读取内容,并验证文件尾的校验和信息,redis_check_rdb函数完成了对RDB文件的检测。然而,redis-check-rdb命令目前并没有提供修复功能,需要人工进行修复。 总的来说,本文通过介绍Redis对损坏的AOF和RDB文件的处理方法,帮助读者了解了如何使用redis-check-aof和redis-check-rdb命令来检测文件完整性,并对AOF文件进行修复。文章还提到了redis_check_rdb_main函数对RDB文件的检测过程,以及当前并未提供修复功能的情况。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Redis 源码剖析与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • Kaito
    1、RDB 和 AOF 文件在写盘故障时,可能发生损坏不完整的情况,那使用其恢复数据就会出现问题,所以 Redis 提供了 2 个命令来检测文件是否有错误 2、要想检测出文件错误,那说明 RDB 和 AOF 必定是按照某种固定格式写入的,检测是否完整只需要按照其格式规则,发现不符即认为文件不完整 3、redis-check-rdb 命令检测 RDB,因为 RDB 有明确的文件头、数据部分、文件尾,读取文件发现不完整即报错 4、redis-check-aof 命令检测 AOF,AOF 按照 RESP 协议写入,按照这个协议可以读取每个命令参数个数、参数字符串长度,如果不符合协议格式,则说明不完整。但这个命令提供了 --fix 命令,可以修复 AOF 文件,实现原理是:把不完整的命令和后续部分,直接从 AOF 中删除 课后题:redis_check_aof_main 函数是检测 AOF 文件的入口函数,但是它还会调用检测 RDB 文件的入口函数 redis_check_rdb_main,它的作用是什么? Redis 在 4.0 版本支持了「混合持久化」,即在 AOF rewrite 期间,先以 RDB 格式写入到 AOF 文件中,再把后续命令追加到 AOF 中,这样 AOF rewrite 后的文件既包括了 RDB 格式,又包含 AOF 格式(目的是为了让 AOF 体积更小),所以 redis_check_rdb_main 在检测 AOF 文件时,RDB 和 AOF 文件格式都需要检测。
    2021-10-09
    8
  • Ethan New
    redis 4.0后提供了aof rewrite的功能,重写后的aof文件既有RDB格式的数据也有AOF格式的命令,redis_check_aof_main调用redis_check_rdb_main就是为了检测文件中RDB格式的数据。
    2021-10-05
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部