Mysql——InnoDB存储引擎doublewrite

845 阅读1分钟

上一篇:Mysql——InnoDB存储引擎Change Buffer

简介

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

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

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

doublewrite工作原理

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

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

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

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

下一篇:Mysql——InnoDB存储引擎AHI