Shellbye.github.io
Shellbye.github.io copied to clipboard
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