0

MySQL InnoDB 重做日志块大小为 512 字节(可能是磁盘中的一个扇区)。我读了磁盘扇区写入原子吗?. 看起来它取决于底层硬件来决定扇区写入是否是原子的。那么如果它不是原子的,InnoDB 重做日志如何保证它不会被破坏呢?

假设磁盘中最后一个日志块未满,那么 InnoDB 引擎会向该块写入更多日志记录并将其刷新到磁盘。突然断电导致只有部分块已写入磁盘。由于该块的校验和不匹配。服务器重新启动后,其他先前提交的事务将丢失。

4

1 回答 1

0

当事务提交时,mysql 将强制刷新重做日志块(512b)到磁盘,如果日志块未满,mysql 将在刷新到磁盘之前用零(零填充)填充 blcok。

如果刷新操作成功,则事务提交将成功;如果flush动作有错误,事务提交将失败;

因此,如果事务提交成功,则事务的重做日志必须已刷新到磁盘。

如果重做块的校验和不匹配,说明重做日志块刷新动作有错误(如掉电),这个块中重做日志的事务肯定是失败的。

所以当 mysql 掉电恢复时,提交的事务不会丢失,因为成功的事务必须成功地将他的重做日志刷新到磁盘。

最后,为什么重做日志块大小是 512 字节?因为它尝试使用磁盘原子写入(磁盘扇区大小 512 字节)来加快速度并减少不匹配的校验和。如果磁盘不支持 512byte 原子写入,没关系。

于 2022-01-22T13:10:16.380 回答