MySQL如何保证crash-safe


MySQL如何保证crash-safe?

crash-safe

什么是crash-safe,简单来说就是MySQL异常重启,之前提交的记录也不会丢失。

如何保证crash-safe

那么MySQL是如何提供crash-safe这个能力的呢?具体来说,应该是InnoDB提供的这个能力,这就得益于InnoDB的redo log。

redo log是固定大小的一组文件,可通过配置修改数量和文件大小。redo log是物理日志,记录的是数据页上修改了什么内容。这组redo log文件就像一个环形的磁盘,由两个名为write pos和checkpoint的磁头进行控制,write pos表示日志写入的地方,checkpoint表示刷盘的地方,write pos和checkpoint之间的距离就是redo log剩余的空间。如果write pos赶上了checkpoint,那么MySQL就得停下写入,先把日志上的修改刷入磁盘后往前挪动一下checkpoint。当然MySQL不会一直等到write pos追上checkpoint才刷盘,平常如果系统空闲,后台线程就会默默刷盘,如果系统实在繁忙,实在没有空间了,也只能刷盘,这就导致了吞吐量下降。

redo log 来源

为什么会设计出redo log?也就是鼎鼎大名的WAL(Write-Ahead Logging)技术。其实是在机械硬盘时代,磁盘写入是非常耗时的操作,如果数据库每次修改都修改磁盘,代价实在是太大,这无疑是不能接收的。在这种情景下,首先想到的肯定是在内存中修改即可,但是内存并不能保证数据不丢失,所以单单在内存中修改是肯定不行的。这个时候就想到了,磁盘虽然随机写入性能差,但是顺序写入性能还是可以的,这个时候WAL应运而生了。时至今日WAL设计思路应用已经非常广泛,大名鼎鼎的Kafka的消息存储也利用了这种机制,实现了高效消息存储。

小结

  • redo log是MySQL的InnoDB存储引擎提供的一种重做日志,能保障MySQL异常重启不丢数据
  • redo log是物理日志,记录的是数据页上的修改内容。
  • redo log由一组日志文件组成,空间固定,循环写入,由write pos和checkpoint进行控制。
  • redo log是一种WAL技术,保证MySQL的高吞吐量。

文章作者: maybe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 maybe !