博客
关于我
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/

    你可能感兴趣的文章
    MySQL 面试题汇总
    查看>>
    MySQL 面试,必须掌握的 8 大核心点
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>
    MySQL 高性能优化规范建议
    查看>>
    mysql 默认事务隔离级别下锁分析
    查看>>
    Mysql--逻辑架构
    查看>>
    MySql-2019-4-21-复习
    查看>>
    mysql-5.6.17-win32免安装版配置
    查看>>
    mysql-5.7.18安装
    查看>>
    MySQL-8.0.16 的安装与配置
    查看>>
    MySQL-Buffer的应用
    查看>>
    mysql-cluster 安装篇(1)---简介
    查看>>
    mysql-connector-java.jar乱码,最新版mysql-connector-java-8.0.15.jar,如何愉快的进行JDBC操作...
    查看>>
    mysql-connector-java各种版本下载地址
    查看>>
    mysql-EXPLAIN
    查看>>
    MySQL-Explain的详解
    查看>>
    mysql-group_concat
    查看>>
    MySQL-redo日志
    查看>>
    MySQL-【1】配置
    查看>>
    MySQL-【4】基本操作
    查看>>