今天同大家分享一个mysql的知识点,Double write buffer。
1.Double write buffer是干什么的?
为了解决写失效问题,实现InnoDB引擎数据页的可靠性
既然是实现数据页的可靠性,那么就必然存在数据页不可靠的情况,那么这种情况是什么呢?就让我们先了解下partial page write(部分页失效)的问题。
2.partial page write(部分页失效)
我们都知道InnoDB中,每个PageSize的大小是16KB,但是操作系统的页大小是4KB,当我们读取InnoDB数据页数据的时候,我们是以每次4KB的大小去读取数据的,那么就会存在当我们在写数据的时候,数据页刚写了8KB的数据,突然宕机了,那么就会有8KB的数据丢失,这就是写失效问题。
3.那么Double Write是如何解决写失效的问题呢?
我们先来看下Double Write的执行流程,如下图所示:
1.当我们的Buffer Pool中出现脏页,会首先将脏页数据同步到Log Buffer中。
2.之后就会通过一个函数将脏页数据复制一份放到Double Write Buffer(2M)中。
3.Double Write Buffer会将数据顺序写入磁盘里共享表空间中ibdata文件中的double write空间内(每块大小1M)
4.第一次写完之后,Double Write Buffer会马上调用fsync函数,再将数据写入到独立表空间的数据文件中,也就是.ibd文件中。
5.这两步都写完之后,才会将Log Buffer中的数据同步到Redo Log文件中。
Double Write Buffer之所以写两次,而不是直接写到独立表空间中,是因为共享表空间的ibdata文件专门划出了两块连续的空间,这样Double Write Buffer在写入数据的时候,是顺序写入,效率是非常高的,这样能最快的将数据写入到磁盘中。
有了这样的双写机制之后,如果操作系统在写数据页到磁盘的中途再发生宕机,那么InnoDB就可以从共享表空间中已有的数据副本,将page页数据还原,然后再应用Redo log进行重做,这就是double write。