博客
关于我
MySQL 的 crash-safe 原理解析
阅读量:800 次
发布时间:2019-03-24

本文共 1750 字,大约阅读时间需要 5 分钟。

MySQL Crash-Safe 原理解析:事务提交与数据持久性的技术奥秘

一、前言

MySQL 时代最流行的关系型数据库之一,其在保证数据不丢失方面具有独特的能力。这种能力主要体现在以下两方面:

  • 数据恢复到任意时间点:只要保留足够的二进制日志(binlog),就能通过重放二进制日志来实现。
  • 增量恢复能力:在 InnoDB 存储引擎中,事务提交过程中任何阶段的MySQL 突然崩溃,重启后都能保证未提交数据的完整性,已提交的数据不会丢失。
  • 这个增量恢复能力依赖于两个关键日志模块:redo log(重做日志)和undo log(回滚日志)。通过理解这些技术背后的原理,我们可以更好地掌握MySQL 的数据持久性设计。


    二、写日志机制(WAL Technology)

    为什么不直接修改磁盘文件?

    直接对磁盘文件进行随机写会导致性能瓶颈严重。MySQL 的解决方案是:

  • 先在内存中修改数据:内存操作速度快,性能更佳。
  • 使用写日志技术(WAL):在修改数据前,先将变更记录到日志中。由于写日志属于顺序写,其对磁盘的随机操作优化了性能。
  • Writing Process示例

    update T set c = c + 1 where id = 2

    过程简化为:

    • 修改内存中的数据记录。
    • 将数据页的变更记录到redo log中。
    • 将事务操作记录到binlog中。
    • 后台线程异步刷盘将内存更新写入磁盘。

    三、核心日志模块解析

    如何简化三日志的写入?

  • Redo Log:维护物理页面修改记录,支持增量恢复。
  • Undo Log:用于事务回滚和多版本并发控制(MVCC)。
  • Binlog:记录用户操作,用于主从同步和基于时间点的数据库还原。
  • Binlog是否可以简化?

    • 在主从模式中Binlog不可或缺:用于从库数据同步。
    • 在单机模式中:Binlog可选关闭,但建议开启以支持基于时间点的数据还原。

    四、两阶段提交机制

    为什么要分两阶段写入?

    因为 redo log 和 binlog 记录的事务必须保持一致性,这就需要两阶段提交:

  • 阶段一(prepare):写 redo log 到磁盘,设置状态为 "prepare"。
  • 阶段二(commit):写 binlog 到磁盘并提交事务。
  • 为什么会出现性能问题?

  • 锁竞争:事务提交阶段使用锁控制,增加了并发处理额外开销。
  • 磁盘 fsync 操作:每次提交都需要两次磁盘同步操作(一次 redo log,另一次 binlog)。

  • 五、组提交优化

    提升性能的解决方案

    MySQL 5.6 引入 binlog 组提交(BLGC):

    • 队列机制:通过队列处理事务,保证 binlog 和 redo log 的提交顺序一致。
    • 分组提交:将事务分组,每组的 binlog 卷写任务交由一个事务处理,降低磁盘 IOPS 操作次数。

    组提交的优势

  • 减少锁竞争:锁粒度更小,减少事务调度等待时间。
  • 增量优化:通过组提交减少磁盘读写操作(/fsync),提升性能。

  • 六、数据恢复流程

    假设服务器发生崩溃,重启后如何恢复数据?

  • 重启后步骤

    • 检查 redo log 中处于 "prepared" 状态的事务。
    • 根据 XID(事务 ID)从 binlog 中找到对应事务。
    • 回滚未提交的事务:如果 binlog 中没有完整的事务记录,则通过 undo log 进行回滚。
    • 分别处理已提交事务:重新提交 redo log,并清理相关日志记录。
  • 具体恢复时刻分析

    • 时刻 A(内存尚未刷盘):无需恢复,事务未提交。
    • 时刻 B(撰写 redo log 未完成):检查 binlog 和 undo log 完整性决定回滚或重新提交。
    • 时刻 C( binlog 已刷盘但 redo log 未提交):类似时刻 B 的处理流程。
    • 时刻 D(事务已提交):恢复已完成,无需额外处理。
  • 通过上述流程,MySQL 保证了在崩溃后能够快速、安全地恢复数据,确保业务持续性。


    结论

    通过了解 MySQL 的 crash-safe 原理,我们可以更深入地掌握其数据持久性和高可用性能力。轶然复杂的日志机制和两阶段提交结构为核心的设计理念,值得我们细致研究和实践。

    更多技术内容,欢迎关注 vivo 互联网技术 微信公众号。

    转载地址:http://rllkk.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战—使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战篇——基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战|OpenCV实时弯道检测(详细步骤+源码)
    查看>>
    OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
    查看>>
    OpenCV与AI深度学习 | 工业缺陷检测中数据标注需要注意的几个事项
    查看>>
    OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
    查看>>
    OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 水下检测+扩散模型:或成明年CVPR最大惊喜!
    查看>>
    OpenCV与AI深度学习 | 深度学习检测小目标常用方法
    查看>>
    OpenCV与AI深度学习 | 超越YOLOv10/11、RT-DETRv2/3!中科大D-FINE重新定义边界框回归任务
    查看>>
    OpenCV与AI深度学习 | 高效开源的OCR工具:Surya-OCR介绍与使用
    查看>>
    OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)
    查看>>
    Opencv中KNN背景分割器
    查看>>
    OpenCV中基于已知相机方向的透视变形
    查看>>
    OpenCV中的监督学习
    查看>>
    opencv中读写视频
    查看>>
    OpenCV中遇到Microsoft C++ 异常 cv::Exception
    查看>>
    opencv之cv2.findContours和drawContours(python)
    查看>>
    opencv之namedWindow,imshow出现两个窗口
    查看>>