InnoDB关键特性之doublewrite
程序员文章站
2022-05-21 18:58:24
...
部分写失效
想象这么一个场景,当数据库正在从内存向磁盘写一个数据页时,数据库宕机,从而导致这个页只写了部分数据,这就是部分写失效,它会导致数据丢失。这时是无法通过重做日志恢复的,因为重做日志记录的是对页的物理修改,如果页本身已经损坏,重做日志也无能为力。
两次写机制
从上面分析我们知道,在部分写失效的情况下,我们在应用重做日志之前,需要原始页的一个副本,两次写就是为了解决这个问题,下面是它的原理图:
两次写需要额外添加两个部分:
1)内存中的两次写缓冲(doublewrite buffer),大小为2MB
2)磁盘上共享表空间中连续的128页,大小也为2MB
其原理是这样的:
1)当刷新缓冲池脏页时,并不直接写到数据文件中,而是先拷贝至内存中的两次写缓冲区。
2)接着从两次写缓冲区分两次写入磁盘共享表空间中,每次写入1MB
3)待第2步完成后,再将两次写缓冲区写入数据文件
这样就可以解决上文提到的部分写失效的问题,因为在磁盘共享表空间中已有数据页副本拷贝,如果数据库在页写入数据文件的过程中宕机,在实例恢复时,可以从共享表空间中找到该页副本,将其拷贝覆盖原有的数据页,再应用重做日志即可。
其中第2步是额外的性能开销,但由于磁盘共享表空间是连续的,因此开销不是很大。可以通过参数skip_innodb_doublewrite禁用两次写功能,默认是开启的,强烈建议开启该功能。
推荐阅读
-
2. InnoDB 存储引擎-InnoDB体系架构、InnoDB的关键特性、Master Thread、insert buffer、两次写、自适应哈希索引、异步IO
-
MySQL Innodb关键特性之插入缓冲(insert buffer)
-
谷歌、脸书、魔兽世界都在用!InnoDB是什么?有哪些关键特性?
-
InnoDB的关键特性-插入缓存,两次写,自适应hash索引详解
-
[MySQL]InnoDB特性之-两次写_MySQL
-
【Innodb三大特性之double write】
-
InnoDB关键特性之insert buffer
-
Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional
-
InnoDB关键特性之doublewrite
-
InnoDB存储引擎关键特性