知识卡片

InnoDB崩溃恢复真正依赖的是硬件对fsync的真实承诺

普通读书笔记卡

内容

InnoDB每次启动都会检测数据和日志文件、按需自动执行恢复——这里的 “恢复”和备份恢复完全是两回事,它不是从某份历史快照里还原数据,而是 根据日志文件把已提交但还没落到数据文件的变更重新应用一遍,同时把 未提交的变更回滚掉,让数据文件回到”崩溃那一刻所有已提交事务的结果” 这个一致状态。多数情况下这个过程会自动、安静地跑完,不需要人工介入。 但InnoDB自身健壮性有一个隐藏的前提:它依赖无缓存的I/O调用和fsync() 在数据真正写入物理介质后才返回,只要硬件层面遵守这个承诺,InnoDB的 崩溃恢复就是可靠的。真正容易被忽视的损坏根源,往往不是InnoDB自身的 缺陷,而是硬件对这个承诺的”撒谎”——常见的错误配置是打开了不带电池 备份单元的RAID卡回写缓存,或打开了磁盘本身的回写缓存:这类配置下, fsync()调用会在数据实际只停留在易失性缓存里、还没写到磁盘的情况下 就返回”已完成”,因为默认打开这类缓存能换来更好的性能表现,对很多 非事务型场景没有问题,但对需要持久性保证的事务数据服务而言,一旦 真的断电,缓存里那部分”号称已经落盘”的数据会直接丢失,而InnoDB此前 对这些数据的一致性判断全都建立在”fsync已经真正生效”这个前提上,前提 一旦不成立,恢复过程本身也无法弥补。这说明评估一个InnoDB服务的崩溃 安全性,不能只看MySQL/InnoDB自身的机制设计得多严谨,还必须核实底层 硬件/存储配置是否真的诚实地履行了持久化承诺——这是数据库软件层面的 正确性保证和硬件层面的诚实承诺之间的一个关键接缝,软件设计得再好, 接缝这一环松动了,整体保证照样会失效。

参考来源

- 位置:《高性能MySQL:第3版》第15章"备份与恢复"15.6.5节"InnoDB崩溃 恢复"(源文件:_epub-src/OEBPS/Text/part0022.xhtml) - 结论依据:原文明确"InnoDB依赖于无缓存的I/O调用和fsync()调用,直到 数据完全地写入到物理介质上才会返回。如果硬件不能保证写入的持久化, InnoDB也就不能保证数据的持久,崩溃就有可能导致数据损坏……常见的 错误配置包括打开了不包含电池备份单元的RAID卡的回写缓存,或打开了 硬盘驱动器本身的回写缓存。这些错误将会导致控制器或驱动器'撒谎', 在数据实际上只写入到回写缓存上而不是磁盘上时,却说fsync()已经 完成",直接说明InnoDB崩溃恢复对硬件fsync承诺的依赖及常见的硬件 配置陷阱。 - 原始内容:InnoDB依赖于无缓存的I/O调用和fsync()调用,直到数据完全 地写入到物理介质上才会返回……这些错误将会导致控制器或驱动器"撒谎", 在数据实际上只写入到回写缓存上而不是磁盘上时,却说fsync()已经完成。