InsertBuffer 提升了性能, 而双写技术就提升了数据页的可靠性。
部分写失效问题
InnoDB 写入某个页到表中时,16kb的数据,可能只写入4kb, 而此时数据库发生了宕机,就会发生写入失效。虽然可以通过redolog进行恢复,但是需要注意的时,我们的redolog是物理日志,那么如果某个页 本身已经失效的话,那么重做是没有意义的。因此 在发生写入失效时,在使用redolog进行恢复之前,需要用当前页的一个副本,来还原该页,然后 再使用redolog 进行恢复。这就是双写技术。
双写的实现
- 双写的组成: 一个 dw buffer 2MB, 一个磁盘共享表空间连续的 128个页 即2个区 2MB。

- 在将脏页 刷新时,不会直接写入到磁盘, 通过 mempy 函数 将脏页复制都内存的 bwbuffer中,然后分两次将buffer的内容写入到共享表空间的磁盘中,每次写入磁盘1MB,因为共享表空间磁盘的页连续的因此是顺序的写入。
因此 当数据库崩溃时, 在恢复的过程时,先从共享表空间中 的doublewrite拿到 该页的一个副本,将其复制到表空间文件,进行页恢复,最后才会用redolog 去重做。
总结
双写解决的问题: 在使用redelog进行重做时,有可能这个页本身因此损坏,因此重做是没有意义的,因此,为了避免部分写并且页损坏带来的数据丢失,就引入了双写技术,在将脏页写到磁盘时,会先复制一份 到 双写buffer中, 然后分两次写入到共享表空间中,
