这个问题是在某个群里面,看见有人问的,已经2020年了,到底Double write 能不能关,这是一个好问题。因为有些数据库压根没有 Double write 也就没有性能上的损耗了。那为什么MYSQL 要有DOUBLE WRITE ,并且可以关吗?
可以关,但你做好关的准备了吗? 你的磁盘系统支持full page 写吗(实际上这方面是既有硬件解决方案,也有数据库设计方案来解决),如果支持,自然是可以关闭的,如果没有,那你做好数据库服务器意外后的数据库无法启动或数据丢失的恢复准备了吗?
所以到目前为止DW 你好别关。到底什么是DW 画一个图来说一下,
因为MYSQL 的页面大小是16K, 而每次写入的数据不保证是16K ,例如写到4K 的时候机器故障,剩下的12K 就丢失了,系统在重新启动的时候,如何恢复这12K的数据,去哪里找,这就是REDO的存在必要所在,需要解决 partial page write,当mysql将脏数据flush到data file的时候, 先使用memcopy 将脏数据复制到内存中的double write buffer ,之后通过double write buffer再分2次,每次写入1MB到共享表空间,然后马上调用fsync函数,同步到磁盘上,避免缓冲带来的问题,在这个过程中,doublewrite是顺序写,开销并不大,在完成doublewrite写入后,在将double write buffer写入各表空间文件,这是离散写入。
而提出能不能关DW 主要原因就是性能,因为性能,性能,性能,在数据落盘之前要进行一个(性能消耗较低)的 DW ,而为了性能求索的人们就会有类似的问题被祭出。
那DW 平时是怎么工作的
1 打开DW 当服务器crash后,重新启动后,CHECKSUM发现当前的数据页面不完整, 内存中的数据并未刷入到磁盘,InnoDB就不能通过事务日志来恢复机器crash前的事务, 所以需要直接用DW的数据修正损坏的页面
2 然后系统将redo 中存储信息刷入到内存BUFFER 中,重新将数据写入到对应的写失败的PAGE 页中( 这也是重做的含义)
3 然后进行正常的数据库启动初始化的工作。
没有DW在服务器crash后的衔接,那MYSQL很可能就会因为损坏的数据page而导致重启后无法正常工作。
所以DW的主要意义在于系统意外CRASH后数据页面的损坏与REDO LOG 进行恢复之间的衔接。
引用经典的一个图
是不是可以关闭DW,各位性能达人需要认可
1 你的系统可以允许数据丢失和无法在CRASH 后数据库可能无法正常启动的几率
2 你的硬件,或磁盘系统格式支持 FULL PAGE 的写入,不会有不正确或缺失的PAGE 写入你的数据文件
除此以外,不建议你关闭DW