MySQL如何保证crash-safe的()

背景知识
可以先看一下我写的为什么需要两阶段提交,两阶段提交+redo log保证了crash-safe
疑问
两阶段提交是流程上的保证,但是在向redo log(位于内存中的log buffer)中写数据后,如何保证redo log向磁盘写入成功呢?
Linux背景知识
在向磁盘写数据时,一般都会先把数据写进内存内核态中的page cache,然后再调用fsync()函数进行数据的刷盘。
所以针对应用程序向磁盘写数据,一般是这样的流程

MySQL如何保证crash-safe的()
文章图片
image.png 其中涉及到了三个存储数据的位置,分别是

  1. 用户内存 xxx buffer
  2. 内核态内存 page cache
  3. 磁盘
通过参数配置
【MySQL如何保证crash-safe的()】使用innodb_flush_log_at_trx_commit进行相应的配置。
严格程度由弱到强分别是
0:写到用户态 xxx buffer
2:写到内核态内存 cache page
1:直接写到硬盘中
一般为了数据的不丢失,都会选择1,但也会导致性能有所下降。

    推荐阅读