redo log 和 bin log 的两阶段提交

两阶段提交的过程

当事务提交后,有一个两阶段提交策略。

在开启两阶段提交时,会开启一个 XA 事务(宏观上的事务),

Prepare 阶段:将 redo log 的状态设置为 prepare,然后将 事务XID 写入 redo log,然后提交 redo log

Commit 阶段:将事务 XID 写入bin log,然后对 bin log 刷盘,最后将 redo log 的状态设置为 commit

当断电后,进行崩溃恢复时,会按照顺序扫描 redo log 文件

  1. 会首先查看 redo log 的状态,如果 redo log 的状态为 commit,则说明事务的两阶段提交已经完成,可以放心进行数据恢复。

  2. 如果 redo log 状态为 prepare,则检查 redo log 中的 XID

  3. 再根据 XID 去 bin log 中进行查找,如果 bin log 中不存在 XID,则说明 虽然 redo log 刷盘了,但是 bin log 没有刷盘,此时会进行事务回滚(根据 undo log 回滚)

  4. 如果 bin log 存在 XID,则虽然 redo log 处于 prepare 状态,但 bin log 已经刷盘了,此时会对事务进行提交。同时也可以放心进行数据恢复。

为什么有两阶段提交

主要是为了保证主从数据库一致性。

若没有两阶段提交,可能发生 redo log 已经刷入磁盘但 bin log 没有刷入磁盘,或者 bin log 已经刷入磁盘而 redo log 没有刷入磁盘的情况。如果是前者,若断电,则崩溃恢复后主数据库的数据可以恢复,而从数据库从 bin log 中获取到的数据是有缺失的,从而导致主从不一致。如果是后者,若断电,则恢复后,主数据库的数据会丢失,而从数据库的数据可以恢复完整,也会导致主从不一致现象。

相关推荐
Quincy_Freak24 分钟前
信创内网数据规范实践:银河麒麟下SQLite本地数据安全管理方案
数据库·sqlite·arm·数据库管理·大数据分析·银河麒麟·aarch64
至乐活着1 小时前
MySQL索引底层原理与查询优化实战:从B+树到执行计划
mysql·b+树·查询优化·sql性能·索引原理
2601_962683892 小时前
治理遗留系统中的“生肉 SQL”:一次用多模型协作优化慢查询的实战复盘
数据库·人工智能·sql
酱学编程3 小时前
【从零到一实现一个 AI Agent 框架 · 第四篇】04. 任务规划:拆解复杂目标 -
服务器·网络·数据库·人工智能
shushangyun_4 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习
华山令狐虫5 小时前
DBAPI AI 写 SQL:支持动态 SQL 与参数占位符,自然语言一键生成
数据库·人工智能·sql·dbapi
IvorySQL5 小时前
PG 技术日报|2026-07-04
数据库·人工智能·postgresql·开源
Hoxy.R6 小时前
KingbaseES读写分离高可用集群扩容、备库重建与故障切换实战
运维·数据库
IvorySQL6 小时前
IvorySQL HTAP 实时湖仓接入引擎
数据库·postgresql·开源·htap·ivorysql
忧郁的紫菜6 小时前
WCF+JSON+实体对象与WebService+DataSet效率大比拼
数据库·oracle·json