知识卡片
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()已经完成。