Mysql redolog两阶段提交
2021-08-12
Mysql redolog两阶段提交
一. redolog的作用
-
提高写入性能
为什么说能提高写入性能?
假设一条修改语句影响了1000条数据, 此时1000条数据在磁盘上不是连续的, 所以会产生随机IO, 随机IO性能远远小于顺序IO, redolog 是顺序写,默认是2个48M文件, 循环使用, 机械硬盘会有上百倍的差距
-
保证数据安全
假设没有redolog, 我们的修改操作是直接修改硬盘, 看看会有什么问题
原本的数据为: 奥特曼打怪兽
我们想要修改成: 怪兽打奥特曼
硬盘刚刚写入2个字, 机器断电了
此时硬盘上的数据就变成了怪兽曼打怪兽 这并不是我们想要的结果, 还不如更新失败
使用redolog就能保证数据的安全
二. 语句的执行过程
三. 分析断电的时间点
-
在上图的时间点1发生断电, sql执行失败, 不影响数据
-
在上图的时间点2发生断电, 不管redolog是否写入成功, binlog还没有写入, 所以重新启动的时候, 数据不会恢复
-
在上图的时间点3发生了断电
-
redolog写入成功(prepare状态),binlog也写入成功, 数据库重新启动后, 会恢复数据, 并且把redolog prepare状态修改成commit状态
-
redolog写入成功(prepare状态), binlog还没有写入, 所以重新启动的时候, 数据不会恢复
-
网上没有查到该资料, 但是我感觉会产生
redolog设置innodb_flush_log_at_trx_commit=0
binlog不管sync_binlog设置成什么, 都应该有概率发生如下情况
redolog没有写入, binlog写入成功
这种情况网上没有查到资料, 暂时先放弃研究
总结,如果mysql重启的时候发现redolog和binlog都有这条记录, 就会恢复数据, 并且把redolog的状态改成commit, 如果只有redolog有记录, binlog没有记录, 就会放弃掉这条数据
-
四. double write
这不是本篇文章的重点, 有兴趣的可以看1下下面这篇