Mysql redolog两阶段提交

2021-08-12

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


标题:Mysql redolog两阶段提交
作者:小可大魔王
地址:http://xiaokedamowang.cn/articles/2021/08/12/1628777625876.html