Mysql redolog 两阶段提交

本贴最后更新于 1197 天前,其中的信息可能已经物是人非

Mysql redolog 两阶段提交

一. redolog 的作用

  1. 提高写入性能

    为什么说能提高写入性能?

    假设一条修改语句影响了 1000 条数据, 此时 1000 条数据在磁盘上不是连续的, 所以会产生随机 IO, 随机 IO 性能远远小于顺序 IO, redolog 是顺序写,默认是 2 个 48M 文件, 循环使用, 机械硬盘会有上百倍的差距

  2. 保证数据安全

    假设没有 redolog, 我们的修改操作是直接修改硬盘, 看看会有什么问题

    原本的数据为: 奥特曼打怪兽

    我们想要修改成: 怪兽打奥特曼

    硬盘刚刚写入 2 个字, 机器断电了

    此时硬盘上的数据就变成了怪兽曼打怪兽 这并不是我们想要的结果, 还不如更新失败

    使用 redolog 就能保证数据的安全

二. 语句的执行过程

  • image-20210812215210715

三. 分析断电的时间点

  1. 在上图的时间点 1 发生断电, sql 执行失败, 不影响数据

  2. 在上图的时间点 2 发生断电, 不管 redolog 是否写入成功, binlog 还没有写入, 所以重新启动的时候, 数据不会恢复

  3. 在上图的时间点 3 发生了断电

    1. redolog 写入成功(prepare 状态),binlog 也写入成功, 数据库重新启动后, 会恢复数据, 并且把 redolog prepare 状态修改成 commit 状态

    2. redolog 写入成功(prepare 状态), binlog 还没有写入, 所以重新启动的时候, 数据不会恢复

    3. 网上没有查到该资料, 但是我感觉会产生

      redolog 设置 innodb_flush_log_at_trx_commit=0

      binlog 不管 sync_binlog 设置成什么, 都应该有概率发生如下情况

      redolog 没有写入, binlog 写入成功

      这种情况网上没有查到资料, 暂时先放弃研究

    总结,如果mysql重启的时候发现redolog和binlog都有这条记录, 就会恢复数据,
    并且把redolog的状态改成commit, 如果只有redolog有记录, binlog没有记录, 就会放弃掉这条数据
    

四. double write

这不是本篇文章的重点, 有兴趣的可以看 1 下下面这篇

参考:InnoDB 关键特性之 double write

  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    340 引用 • 708 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...