Shellbye.github.io icon indicating copy to clipboard operation
Shellbye.github.io copied to clipboard

MySQL InnoDB Doublewrite Buffer 两次写 Note

Open Shellbye opened this issue 5 years ago • 0 comments

概念解释

1.Page(页)

PageMySQL里面磁盘( 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 writeMySQL引入Doublewrite BufferDoublewrite的过程可以用下面的图进行简单的说明 innodb_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

Shellbye avatar Mar 18 '19 12:03 Shellbye