参考链接
两阶段提交的作用
为了保证两份日志(redolog和binlog)的的逻辑一致性,mysql采用【两阶段日志】提交
两阶段提交的恢复
step1,顺序扫描redolog,如果 既有prepare标识 也有commit标识,就直接提交,(复制 redolog disk数据页数据到磁盘上数据页)
step2,如果redolog只有prepare标识 ,没有commit标识,(说明当时事务在提交时候,crash了,或者在写binlog时失败了),拿着redolog当前事务的Xid,(redolog 和 binlog事务落盘的标识),去 binlog中查看是否有 Xid
场景1:binlog有写入,最后往redolog写commit失败了
binlog中有当前事务的Xid,则提交事务(复制redolog disk中的数据页到磁盘数据页)
场景2:写binlog时失败了。
没有当前事务Xid,则回滚事务(使用undolog来删除redolog中的对应事务)
什么是两节点提交
redo分为两个步骤,两个阶段提交
1、prepare(redolog)
2、写binlog
3、commit(redolog)
通过Xid,将 redo 和binlog关联在一起。
顺序写入会有什么问题?
redolog 适用于-主库(DML)
binlog 适用于-从库,主库
- 先写redolog 后写binlog
step1:redolog【prepare,commit】写完
step2:binglog还未写完时候,mysql异常
此时在做数据恢复的时候,主库有从库没有
- 先写binlog 后写redolog
Step1:binlog 写完
Step2:准备写 redolog 时发生了 异常了
此时在做数据恢复的时候,从库有主库没有
binlog和redolog可以相互替代吗?
- 只要redolog 不要 binlog
redolog是以循环写的方式记录日志的, 所以无法保留历史记录,无法进行数据恢复。
- 只要binlog 不要redolog
wal技术依赖 物理日志进行数据恢复,binlog是逻辑日志不是物理日志,因此无法使用,在恢复是无法单独保证数据的一致性。