什么是double write?
一部分是内存中的double write buffer ,大小为2MB(16k一个页,一共128个页)。
第二部分是磁盘共享表空间的128个数据页,在对脏页进行落盘的时候,并不是直接进行落盘,而是先复制到double write buffer,然后再分别写入到共享表空间,然后再写入表空间。
为什么要有双写机制?
页面的刷新会遇到部分写的问题,也就是说对于其中一个页面只写了一部分的内容,在数据库崩溃后,传统的数据库会使用redo log进行恢复,恢复的原理是通过redo对数据也进行重新进行物理操作,但是如果这个数据页本身发生了损坏,那innodb的页面大小是16KB,但是写入过程中只写了4KB(操作系统仅仅保证512字节写入的完整性),这个是时候因为页面不是完整的,因此不能通过redo来进行恢复。
Redo log中不包含完整的数据页(性能考虑),通常只包含对数据页的变更记录。
所以通过完好的原始数据页结合redo log中的记录,可以推断导出变更后的正确数据页,而一旦原始数据页损坏,则无法推导出正确的变更后的数据页。
redo恢复的前提条件是页是完整的。那么redo对其进行重做也是没有作用的,innodb的二次写,在写入的时候,创造了一个关于页的副本,这样即使在发生写失效后,也可以通过副本页,对还原重做。
双写是否会大大降低写性能?
通常不会,双写无疑会增加磁盘IO压力的,为了尽可能降低性能影响,双写在buffer落盘的时候,使用批量+顺序写的方式进行。假设要写入磁盘的数据页有64页,那么直接写数据文件会产生64次fsync,使用双写的情况下,假设双写Buffer落盘的批大小为64页,则落盘只需要1次fsync(总体fync加1),并且双写Buffer落盘是顺序写文件,也保障了文件写入的性能。所以通常情况下,使用双写并不会大大降低写性能。
5.7和8.0的区别
5.7

最低0.47元/天 解锁文章
1277

被折叠的 条评论
为什么被折叠?



