mysql innodb doublewrite

Double write写给innodb带来的是可靠性,主要用来解决部分写失败(partial page write)。

doublewrite有两部分组成,一部分是内存中的doublewrite buffer,大小为2M,另外一部分就是物理磁盘上的共享表空间中连续的128个页,即两个区,大小同样为2M。

当缓冲池的胀业刷新时,并不直接写硬盘,而是通过memcpy函数将脏页先拷贝到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次写,每次写入1M到共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘。以下命令可以查看doublewrite的使用 情况。

1
2
3
4
5
6
7
mysql> show global status like 'innodb_dblwr%';
+----------------------------+----------+
| Variable_name | Value |
+----------------------------+----------+
| Innodb_dblwr_pages_written | 60511554 |
| Innodb_dblwr_writes | 828734 |
+----------------------------+----------+

这台DB doublewrite一共写了60511554个页,但实际写入次数为828734,60511554/828734=73。说明这台DB的压力一般。 slave上可以通过设置skip_innodb_doublewrite参数关闭两次写功能来提高性能,但是master上一定要开启此功能,保证数据安全。

skip_innodb_doublewrite,是一个自读变量,需在配置文件中设置,并重启生效。