是先写redo log还是先写binlog,哪个又先commit
对于一条写语句,写入的时候是先写redo日志还是先写binlog日志呢?以innodb为例
实际顺序如下:
- 会话发起COMMIT动作
- 存储引擎层开启[Prepare]状态:在对应的Redo日志记录上打上Prepare标记
- 写入binlog并执行fsync(刷盘)
- 在redo日志记录上打上COMMIT标记表示记录提交完成
先写redo,后写binlog,为什么?
可以看到先写了redo日志,但是最后才提交了redo日志,这是为什么呢?
这个是由于MySQL是通过binlog进行复制传输的,若先提交了redo日志,还没写入binlog时候掉电了,MySQL实例恢复时根据redo日志来进行恢复,会出现这边有而从库复制端没有这个记录的问题,数据不一致了。
MySQL的复制恢复步骤
说道恢复,简单聊下MySQL的复制恢复的步骤。
- 对于活跃的事务,直接回滚
- 对于redo中是Prepare状态的事务,如果binlog中已记录完成则提交,否则回滚事务