声明:本文章内容是根据极客时间中林晓斌的课程《MYSQL45讲》,经过学习,加以自己的理解形成的笔记。具体原文可以到官网进行阅读。如有侵权请,告知删除。
1.MySQL发生异常重启
我们知道,mysql 是支持crash-save的,他依靠的机制是 binlog(归档日志)和redo log(重做日志),依靠两阶提交,保证数据日志的一致性。
1.1时刻A 发生异生常重启
重启之后,发现并没有写 binlog.加上redo log 还没有commit ,那么会重启之后会发生回滚。
1.2时刻B 发生重启
1.如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交;
2.如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整:
- a. 如果是,则提交事务;
- b. 否则,回滚事务。
2:redo log 和 binlog 是怎么关联起来的?
他们之间有一个共同的数据字段,叫做XID。崩溃恢复的时候,扫描redo log:
- 如果是既 prepare 又commit的redo log ,就直接提交
- 如果只有parepare,但是没有 commit的redo log,就拿着XID去binlog找对应的事务