MySQL如何保证crash-safe的?

背景知识

可以先看一下我写的为什么需要两阶段提交,两阶段提交+redo log保证了crash-safe

疑问

两阶段提交是流程上的保证,但是在向redo log(位于内存中的log buffer)中写数据后,如何保证redo log向磁盘写入成功呢?

Linux背景知识

在向磁盘写数据时,一般都会先把数据写进内存内核态中的page cache,然后再调用fsync()函数进行数据的刷盘。
所以针对应用程序向磁盘写数据,一般是这样的流程


MySQL如何保证crash-safe的?_第1张图片
image.png

其中涉及到了三个存储数据的位置,分别是

  1. 用户内存 xxx buffer
  2. 内核态内存 page cache
  3. 磁盘

通过参数配置

使用innodb_flush_log_at_trx_commit进行相应的配置。
严格程度由弱到强分别是
0:写到用户态 xxx buffer
2:写到内核态内存 cache page
1:直接写到硬盘中

一般为了数据的不丢失,都会选择1,但也会导致性能有所下降。

你可能感兴趣的:(MySQL如何保证crash-safe的?)