InnoDB存储引擎doublewrite

简介

数据库宕机时,重启可以通过redo log重放来恢复丢失的数据。但是必须清楚的地认识到,重做日志中记录的是对页的物理操作,比如偏移量800,写'aaa'记录。

假设有这么一个场景,innoDB存储引擎正在写某个页,这个也有16K,只写了前4k,这个时候发生了宕机,这种情况被称为部分写失效;此时这个页发生了损坏,进行redo log重放是没有意义的。

doublewrite就是用来解决这个问题的。

doublewrite工作原理

image

如图所示,doublewrite由两部分组成:

  • 内存中的doublewrite buffer,大小2M;
  • 磁盘系统表空间的doublewrite buffer,大小2M;

innoDB缓冲池在对脏页进行刷新时,并不直接写入磁盘;而是通过memcpy函数将脏页先复制到内存中的doublewrite buffer,之后分两次写到系统表空间的doublewrite buffer,接着调用fsync同步磁盘。因为系统表空间doublewrite buffer是顺序写入,开销不会很大。
完成以上步骤后,才将内存中的doublewrite buffer写到独立表空间,也就是真正数据的存放位置。

从以上流程来看,doublewrite的目的就是备份,如果将内存中的doublewrite buffer写到独立表空间这一步发生了宕机,redo log重放之前,会从系统表空间找到该页的一个副本,将其复制到独立表空间,接着再做日志重放。

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

推荐阅读更多精彩内容