欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > MySQL Redo Log 两阶段提交

MySQL Redo Log 两阶段提交

2025/7/16 11:11:33 来源:https://blog.csdn.net/weixin_44842084/article/details/145343041  浏览:    关键词:MySQL Redo Log 两阶段提交

MySQL Redo Log 两阶段提交(2PC)

1. 两阶段提交(2PC)流程

两阶段提交确保 Redo LogBinlog 一致,流程如下:

第一阶段:Prepare

  1. 事务执行 SQL,修改数据。
  2. Redo Log 记录写入磁盘,但标记为 prepare 状态(数据未真正提交)。
  3. MySQL Server 层通知事务已准备好提交。

第二阶段:Commit

  1. Binlog 写入并刷盘(保证不会丢失)。
  2. Redo Log 变更为 commit 状态
  3. 事务正式提交,完成。

2. 崩溃发生在不同阶段的影响

崩溃时间点恢复后事务状态是否导致数据丢失数据是否一致
Prepare 之前事务未写入日志,恢复后丢弃不会丢失一致
Prepare 之后,Binlog 之前Redo Log prepare,但没有 Binlog,恢复后回滚🚨 可能丢失一致
Binlog 之后,Redo Log Commit 之前Binlog 已写入,Redo Log prepare,恢复后事务会重新提交不会丢失一致
Redo Log Commit 之后事务已完整提交,恢复后 MySQL 通过 Redo Log 恢复不会丢失一致

3. 关键问题分析

(1)Prepare 之后,Binlog 之前崩溃,是否会丢失数据?

  • 会丢失数据,因为 Redo Log prepare 但 Binlog 未写入,恢复时 MySQL 必须回滚事务
  • MySQL 依赖 Binlog 作为事务提交的最终依据,Binlog 丢失的事务会被撤销。

(2)这种数据丢失会带来什么影响?

  • 事务被撤销,数据可能丢失(应用层可能以为提交成功,但事务实际上被回滚)。
  • 可能影响外部系统(如资金扣款、库存修改等,可能导致数据不一致)。
  • 主从复制仍然保持一致性(但主库可能丢失事务,影响业务)。

4. 如何防止数据丢失?

✅ 方案 1:设置 sync_binlog = 1

  • 确保 Binlog 立即刷盘,避免 Binlog 丢失导致事务回滚。

✅ 方案 2:设置 innodb_flush_log_at_trx_commit = 1

  • 保证 Redo Log 在事务提交时立即刷盘,减少丢失风险。

✅ 方案 3:使用 MySQL 8.0 group_replicationsemi-sync replication

  • 半同步复制:保证事务至少写入一个从库的 Binlog 后才确认提交。
  • Group Replication(Paxos/Raft)确保事务不会因崩溃丢失。

✅ 方案 4:应用层增加幂等性与事务补偿

  • 幂等性:确保相同事务多次执行不会影响最终结果(如唯一性检查)。
  • 事务补偿(TCC/SAGA):对于涉及外部系统的事务,提供回滚或补偿机制。

5. 结论

  • 两阶段提交保证数据一致性,但可能导致数据丢失
  • 崩溃恢复时,Binlog 丢失的事务会被回滚,可能影响业务。
  • 最佳实践是同时开启 sync_binlog=1innodb_flush_log_at_trx_commit=1,配合半同步复制或 Group Replication 提高可靠性。
  • 应用层应设计幂等性和事务补偿机制,避免数据丢失对业务的影响

🚀 如果业务对一致性要求极高(如金融支付系统),建议采用分布式事务(TCC/SAGA)或 NewSQL(如 TiDB)来确保更高的数据安全性!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词