本页讨论:
  • 什么是双写缓冲区
  • 为什么需要双写缓冲区

什么是双写缓冲区

双写缓冲区是一个位于系统表空间的存储区域。
在写入时,InnoDB先把从缓冲池中的得到的page写入系统表空间的双写缓冲区。之后,再把page写到.ibd数据文件中相应的位置。

如果在写page的过程中发生意外崩溃,InnoDB在稍后的恢复过程中在doublewrite buffer中找到完好的page副本用于恢复。



doublewrite是顺序写,开销并不大。
所以在正常的情况下, MySQL写数据page时,会写两遍到磁盘上,第一遍是写到doublewrite buffer,第二遍是从doublewrite buffer写到真正的数据文件中。如果发生了极端情况(断电),InnoDB再次启动后,发现了一个page数据已经损坏,那么此时就可以从doublewrite buffer中进行数据恢复了。

为什么需要双写缓冲区

主要是为了避免partial page write(部分页写入)的问题。

InnoDB的page size一般是16KB,其数据校验也是针对这16KB来计算的,将数据写入到磁盘是以page为单位进行操作的。

操作系统写文件是以4KB作为单位的,那么每写一个page到磁盘上,操作系统需要写4个块。而计算机硬件和操作系统,在极端情况下(比如断电)往往并不能保证这一操作的原子性,16K的数据,写入4K时,发生了系统断电或系统崩溃,只有一部分写是成功的,这种情况下就是partial page write(部分页写入)问题。

这时page数据出现不一样的情形,从而形成一个"断裂"的page,使数据产生混乱。这个时候InnoDB对这种块错误是无能为力的.

有人会认为系统恢复后,MySQL可以根据redo log进行恢复,而MySQL在恢复的过程中是检查page的checksum,checksum就是page的最后事务号,发生partial page write问题时,page已经损坏,找不到该page中的事务号,就无法恢复。
innodb只能通过在doublewrite buffer中找到完好的page副本用于恢复。


成为你想看到的世界变革力量

创建者:万乐荣
最后更新时间 : 2018年9月8日 23:14

评论