MySQL事务执行一半宕机,RedoLog与Binlog的二阶段提交如何确保数据一致性?
- 内容介绍
- 文章标签
- 相关推荐
本文共计916个文字,预计阅读时间需要4分钟。
MySQL可以保证一致性,前提是开启了二阶段提交(2PC)。具体来说,需要设置`innodb_flush_log_at_trx_commit=1`和`sync_binlog=1`同时生效。否则,在宕机后可能会丢失事务、读到不一致的状态,甚至导致主从数据分离。
为什么单靠 Redo Log 不够
Redo Log 只管 InnoDB 引擎层的物理页修改,它能保证崩溃后已提交事务不丢失——但前提是:这个“已提交”是数据库自己认定的。如果事务在写完 Redo Log 后、还没来得及写 Binlog 就宕机,MySQL 启动时会认为该事务未完成,直接丢弃;而如果 Binlog 已写入、Redo Log 没刷盘,备库可能重放了这条日志,主库却没应用,造成主从不一致。
所以必须让两个日志达成一致:要么都成功,要么都失败。这就是二阶段提交的必要性。
本文共计916个文字,预计阅读时间需要4分钟。
MySQL可以保证一致性,前提是开启了二阶段提交(2PC)。具体来说,需要设置`innodb_flush_log_at_trx_commit=1`和`sync_binlog=1`同时生效。否则,在宕机后可能会丢失事务、读到不一致的状态,甚至导致主从数据分离。
为什么单靠 Redo Log 不够
Redo Log 只管 InnoDB 引擎层的物理页修改,它能保证崩溃后已提交事务不丢失——但前提是:这个“已提交”是数据库自己认定的。如果事务在写完 Redo Log 后、还没来得及写 Binlog 就宕机,MySQL 启动时会认为该事务未完成,直接丢弃;而如果 Binlog 已写入、Redo Log 没刷盘,备库可能重放了这条日志,主库却没应用,造成主从不一致。
所以必须让两个日志达成一致:要么都成功,要么都失败。这就是二阶段提交的必要性。

