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 下下面这篇
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于