MySQL InnoDB Doublewrite Buffer 两次写 Note
概念解释
1.Page(页)
Page是MySQL里面磁盘( data files)和内存(buffer pool)交换数据的基本单位,一个Page可以包含一行或多行数据。MySQL里面的Page默认大小是16K,而很多操作系统磁盘操作的基本单位是4K,所以MySQL里面的Page在写入磁盘时需要多次磁盘IO,因此就会可能会出现一个问题叫Partial page write。
2.Partial page write(部分写失效)
Partial page write出现的根本原因就是操作系统的磁盘IO操作的基本单位和MySQL的磁盘操作基本单位不一致,导致MySQL里面的Page在写入磁盘时需要多次磁盘IO,而当在多次IO之间系统发生宕机(比如断电),就产生了数据不一致的问题,即磁盘里只存储了部分数据(比如前4K),即Partial page write。
Doublewrite(两次写)
为了避免出现Partial page write,MySQL引入Doublewrite Buffer,Doublewrite的过程可以用下面的图进行简单的说明
当有Page需要刷新到磁盘时(图中左上方两个Page),先使用memcopy把数据复制到内存中的Doublewrite Buffer,然后从Doublewrite Buffer以顺序的读写方式分两次刷新到共享表空间(位于磁盘)上,然后在进行真正的磁盘刷新操作,刷新到磁盘文件中。
参考
1.http://www.cnblogs.com/TeyGao/p/9236208.html 2.https://dev.mysql.com/doc/refman/5.7/en/innodb-doublewrite-buffer.html 3.https://stackoverflow.com/questions/37805316/what-is-a-tablespace-and-why-is-it-used