如果在图中时刻 A 的地方,也就是写入 redo log 处于 prepare 阶段之后、写 binlog 之前,发生了崩溃(crash),由于此时 binlog 还没写,redo log 也还没提交,所以崩溃恢复的时候,这个事务会回滚。这时候,binlog 还没写,所以也不会传到备库。
时刻 B 也就是 binlog 写完,redo log 还没 commit 前发生 crash,崩溃恢复时的判断规则。
- 如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交;
- 如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整:
a.如果是,则提交事务; b. 否则,回滚事务。
MySQL 怎么知道 binlog 是完整的?
一个事务的 binlog 是有完整格式的:
- statement 格式的 binlog,最后