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

    你可能感兴趣的文章
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
    查看>>