当前位置: 首页 > news >正文

MySQL为什么有了redolog还需要double write buffer?

MySQL为什么有了redolog还需要double write buffer?

问题

我们知道MySQL InnoDB引擎使用redolog作为异常容灾恢复的机制,当MySQL进程发生异常退出、机器断电等,在重新启动时,使用redolog恢复。

OK,redolog是被MySQL设计为异常崩溃恢复的,double write buffer同样是为了保证数据完整性,那么既然已经有了redolog,为什么还需要double write buffer(双写缓冲区)呢?

double write buffer

InnoDB用double write buffer(双写缓冲区)来避免页没写完整所导致的数据损坏。当一个磁盘写操作不能完整地完成时,不完整的页写入就可能发生,16KB的页可能只有一部分被写到磁盘上。有多种多样的原因(崩溃、Bug,等等)可能导致页没有写完整。double write buffer在这种情况发生时可以保证数据完整性。

MySQL的buffer一页的大小是16K,但是底层文件系统一页的大小是4K,换句话说,MySQL将一页buffer数据刷入磁盘,需要写4个文件系统里的页。

假如MySQL内page=1的页准备刷入磁盘,才刷了2个(p1和p2)到文件系统里的页,这个时候停电或者机器宕机,当机器恢复后,buffer的一页数据完整性已经遭到破坏,这时MySQL通过double write buffer来解决数据损坏。

double write buffer是表空间一个特殊的保留区域,在一些连续的块中足够保存100个页。本质上是一个最近写回的页面的备份拷贝。当InnoDB从缓冲池刷新页面到磁盘时,首先把它们写(或者刷新)到double write buffer,然后再把它们写到其所属的数据区域中。这可以保证每个页面的写入都是原子并且持久化的。

如果有一个不完整的页写到了double write buffer,原始的页依然会在磁盘上它的真实位置。当InnoDB恢复时,它将用原始页面替换掉双写缓冲中的损坏页面。

然而,如果double write buffer成功写入,但写到页的真实位置失败了,InnoDB在恢复时将使用双写缓冲中的拷贝来替换。

InnoDB知道什么时候页面损坏了,因为每个页面在末尾都有校验值(Checksum)。校验值是最后写到页面的东西,所以如果页面的内容跟校验值不匹配,说明这个页面是损坏的。因此,在恢复的时候,InnoDB只需要读取double write buffer中每个页面并且验证校验值。如果一个页面的校验值不对,就从它的原始位置读取这个页面。

我们来梳理一下整个数据页落盘刷新的过程:

  1. buffer数据页先copy到double write buffer的内存里;
  2. double write buffer的内存数据刷到double write buffer的磁盘上;
  3. double write buffer的内存再刷到数据磁盘上;

当MySQL出现异常崩溃时,有如下几种情况发生:

情况一:步骤1前宕机,刷盘未开始,数据在redo log,后期可以恢复

情况二:步骤1后,步骤2前宕机,因为是在内存中,宕机清空内存,和情况1一样

情况三:步骤2后,步骤3前宕机,因为DWB的磁盘有完整的数据,可以修复损坏的页数据

由此我们可以得出结论,double write buffer是针对实际的buffer数据页的原子性保证,就是避免MySQL异常崩溃时,写的那几个data page不会出错,要么都写了,要么什么都没有做。

为什么redolog无法代替double write buffer?

redolog的设计之初,是“账本的作用”,是一种操作日志,用于MySQL异常崩溃恢复使用,是InnoDB引擎特有的日志,本质上是物理日志,记录的是 “ 在某个数据页上做了什么修改 ” ,但如果数据页本身已经发生了损坏,redolog来恢复已经损坏的数据块是无效的,数据块的本身已经损坏,再次重做依然是一个坏块。

所以此时需要一个数据块的副本来还原该损坏的数据块,再利用重做日志进行其他数据块的重做操作,这就是double write buffer的原因作用。

因此,double write buffer与redolog对于容灾场景,缺一不可。

本文参考:

《高性能MySQL第三版》

http://www.jsqmd.com/news/446875/

相关文章:

  • 实习面经摘录回答(四)
  • CPU中央处理器(下)
  • 2026年留学生求职必看:中国留学生求职机构选型指南与适配场景全解析 - 品牌推荐
  • vue+elementui完美模拟pc版快手实现短视频,含短视频详情播放
  • TeXLive2023 pdflatex编译eps图像,出现错误的问题
  • 2026年用户口碑最佳的中国留学生求职机构推荐:五家真实服务体验与成果对比 - 品牌推荐
  • android scrollview嵌套webview,滚动冲突解决
  • 2026年中国留学生求职机构深度测评:基于海内外资源覆盖的五维战力解析 - 品牌推荐
  • 第二:Jmeter - 环境搭建
  • 2026年北京审计事务所深度测评:基于上市公司服务与跨境业务能力的五维对比 - 品牌推荐
  • 2026年游客口碑最好的宜昌两天一夜游路线推荐:五大真实体验与避坑对比 - 品牌推荐
  • xLua实现背包的热更新实践
  • Web前端之微信小程实现上下左右全向滑动切换、复杂解构、bindtouchstart、bindtouchend、parseInt
  • 第一:Jmeter-JDK安装和环境变量配置
  • 2026年隐私安全充电宝品牌深度测评:五维安全技术全解析与实战对比 - 品牌推荐
  • 前端「页面懒加载」
  • 软件工程:职业全景与前景深度解析 - 教程
  • 2026年短途度假必看:宜昌两天一夜游路线选型指南与场景化适配攻略 - 品牌推荐
  • 互联网大厂Java面试剧情:内容社区场景下Spring Boot/微服务/AI技术全解
  • Web前端之vue+element-puls的el-form-item实现label和内容换行、同时具有多个类名才起作用的条件样式写法、css类名条件判断、多条件选择器、样式选择器、initial
  • odoo开发中碰到的奇奇怪怪的问题(持续更新)
  • 03 常见服务器的对比
  • NViST 运行笔记
  • 小米笔记本开机提示:no bootable device -- insert boot disk and press any key
  • [esp32-C3][RT-THREAD] 基于ESP32C3运行RT-THREAD bsp最小系统
  • 详细介绍:基于信创openEuler系统安装部署OpenTeleDB开源数据库的实战教程
  • while循环和for循环
  • 状态压缩DP
  • 2026年餐饮业选型必看:商用咖啡机厂家适配指南与核心能力实测对比 - 品牌推荐
  • 把 SQLScript 写成一条好 SQL:深入理解 SAP HANA SQLScript Optimizer 的工作机制与实战调优