MySQL如何保证crash-safe的?

背景知识

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

疑问

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

Linux背景知识

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


image.png

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

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

通过参数配置

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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容