概念
在正式探究这个问题之前,需要先了解一些概念,特别是MySQL在处理数据和持久化时的形式。
首先MySQL数据库文件在磁盘是以页为基本储存单位的,每一页占用固定的16K连续空间,其内储存了一个表的若干行数据,而InnoDB的B+树聚簇索引的叶子节点就是每一页的数据。其次MySQL在读取或修改数据时,都是将作为基本单位的页读取到内存中(Buffer Pool)进行操作的。
在了解清楚这两个概念之后,我们再看一下关于Double Write Buffer和Redo Log的介绍:
双写缓冲区(Double Write Buffer):MySQL的三大特性之一,位于系统表的保留区域(两个1MB大小的连续空间,8.0.20后的版本已独立为两个在安装目录下的1MB文件),在新建或修改的数据页被刷写进磁盘前,会将数据页保存至双写缓冲区,再将双写缓冲区的数据刷写进磁盘。
重做日志(Redo Log):一种物理日志,和InnoDB储存引擎特有的对事务的支持有关,会先在重做日志记录事务提交后对磁盘数据页的修改,再将数据页刷写进磁盘。
相同点
来自于InnoDB储存引擎
为了保证数据正确持久化
串行执行影响系统性能
不同点
双写缓冲区:侧重点是为了保证数据的完整性,跟我们的文件系统扇区大小有关系,通常设置为与磁盘4K对齐,也就是以4K为一个基本空间。而InnoDB一个页是固定大小的16KB,也就是说写入一个页的数据在与硬件交互的层面需要写4次才能成功。如果中途断电宕机,只写入了一部分,那么这个数据页在启动后MySQL会认为是损坏的,此时就可以通过缓冲区记录的页数据再次进行覆盖。
重做日志:更注重数据的一致性,一个事务一般会造成对一个或多个数据页的修改。如果事务提交成功后发生宕机,没有持久化全部的修改,就会导致MySQL的数据出现不一致问题,此时通过读取重做日志的记录就能将未持久化的修改执行完成,能保证事务提交后数据顺利持久化。