[MySQL]InnoDB特性之-两次写_MySQL
程序员文章站
2022-06-16 16:28:24
...
bitsCN.com
[MySQL]InnoDB特性之-两次写
今天我们来介绍InnoDB存储引擎的第二个特性 - 两次写(doublewrite),如果说插入缓冲是为了提高写性能的话,那么两次写是为了提高可靠性,牺牲了一点点写性能。
部分写失效
想象这么一个场景,当数据库正在从内存向磁盘写一个数据页时,数据库宕机,从而导致这个页只写了部分数据,这就是部分写失效,它会导致数据丢失。这时是无法通过重做日志恢复的,因为重做日志记录的是对页的物理修改,如果页本身已经损坏,重做日志也无能为力。
两次写机制
从上面分析我们知道,在部分写失效的情况下,我们在应用重做日志之前,需要原始页的一个副本,两次写就是为了解决这个问题,下面是它的原理图:
两次写需要额外添加两个部分:
1)内存中的两次写缓冲(doublewrite buffer),大小为2MB
2)磁盘上共享表空间中连续的128页,大小也为2MB
其原理是这样的:
1)当刷新缓冲池脏页时,并不直接写到数据文件中,而是先拷贝至内存中的两次写缓冲区。
2)接着从两次写缓冲区分两次写入磁盘共享表空间中,每次写入1MB
3)待第2步完成后,再将两次写缓冲区写入数据文件
这样就可以解决上文提到的部分写失效的问题,因为在磁盘共享表空间中已有数据页副本拷贝,如果数据库在页写入数据文件的过程中宕机,在实例恢复时,可以从共享表空间中找到该页副本,将其拷贝覆盖原有的数据页,再应用重做日志即可。
其中第2步是额外的性能开销,但由于磁盘共享表空间是连续的,因此开销不是很大。可以通过参数skip_innodb_doublewrite禁用两次写功能,默认是开启的,强烈建议开启该功能。
推荐阅读
-
MySQL优化之InnoDB优化
-
MySQL 8 新特性之Invisible Indexes
-
MySQL 8.0 新特性之哈希连接(Hash Join)
-
MySQL 8.0新特性之隐藏字段的深入讲解
-
荐 【MySQL系列7】InnoDB引擎存储结构及InnoDB特性Change Buffer和Double Writer分析
-
MySQL8.0新特性之降序索引
-
MySQL引擎特性:InnoDB同步机制讲解
-
2. InnoDB 存储引擎-InnoDB体系架构、InnoDB的关键特性、Master Thread、insert buffer、两次写、自适应哈希索引、异步IO
-
高性能mysql 之 选择存储引擎(一) mysqlMySQL引擎InnoDB存储引擎
-
MySQL 学习总结 之 初步了解 InnoDB 存储引擎的架构设计