MySQL 两阶段提交

文若2年前技术文章837

说明

MySQL 开启 Binlog 后,所有的事务都会产生 Binlog Event,这些 Event 也是事务数据的一部分。本篇文章介绍 MySQL 如何保证事务 Binlog Event 和 Innodb 引擎中数据的一致性。

1. MySQL 宕机重启

MySQL 宕机重启后,需要保证如下四点:

  • 所有已提交的事务依然存在。

  • 所有未提交的事务全部回滚。

  • 所有已提交事务的 Binlog 依然存在。

  • 所以未提交的事务没有记录 Binlog。

如果数据库重启后数据还在,但是 Binlog Event 不存在,那么就无法将这部分数据同步到其它节点;

如果数据库重启后数据不存在,但是 Binlog Event 还在,那么就会出现主从数据不一致的问题。

为了保证 Binlog 的宕机安全,MySQL 内部使用了两阶段提交来保证一个事物会涉及多方参与时状态的一致性。

2. 两阶段提交

MySQL 在开启 Binlog 后,MySQL 内部会自动将普通事务当作 XA 事务来处理,在提交事务的过程中,MySQL 会自动为每一个事务分配一个唯一的 XID 会被记录到 Binlog 中 Innodb Redo Log 中。

-- Binlog 中 XID 片段:
#210427 11:48:58 server id 553306  end_log_pos 310021 CRC32 0xe92f381e 	Xid = 80
COMMIT/*!*/;

事务提交时会被分成 Prepare 和 Commit 两个阶段:

Prepare 阶段:告诉 Innodb 引擎做 Prepare,Innodb 更改事务状态,并将 Redo Log 写入磁盘。

Cimmit 阶段:先记录 Binlog 日志,然后告诉 Innodb 引擎提交事务。

在数据库宕机重启后,事务可能有如下四种状态:

  • innodb 引擎已 Commit 事务:根据两阶段提交可知,事务已被写入 Binlog Event,所以事务是一致的,无需处理。

  • 在 Innodb 中已完成 Prepare 阶段,Binlog 中已有该事务的 Event,但是该事务未提交,需要通知 Innodb 引擎提交这些事务。

  • 在 Innodb 中已完成 Prepare 阶段,Binlog 中没有该事务的 Event,因为没有记录 Binlog,需要通知 Innodb 回滚事务。

  • Innobd 未完成 Prepare 阶段,根据两阶段提交过程,Binlog 没有记录,需要通知 innodb 回滚事务。


相关文章

如何用 mysqldump 备份数据

前言mysqldump 是 MySQL 官方提供的一款逻辑备份工具,它将生成一组可以导入数据 库中以重现原始数据库中的数据和数据库对象的SQL语句。可用于备份恢复、表结构导出、备份上云。本 SOP 介...

Doris性能测试

Doris性能测试

1.性能测试(1)环境信息硬件环境 软件环境l Doris 部署 3BE 3FE;l 内核版本:Linux version 5.5.0-96-genericl 操作系统版本:CentOS Linux...

MySQL 8.0 Clone 备份恢复演练

前言上一篇文章中,我们介绍了使用 Clone 插件进行备份,相关的恢复流程将在本篇文章介绍。MySQL 8.0 Clone Plugin 详解恢复增量数据的方法,使用的是伪装为 relay log 通...

apiserver指标分析

apiserver指标分析

概述kube-apiserver 是集群所有请求的入口,指标的分析可以反应集群的健康状态。Apiserver 的指标可以分为以下几大类:请求速率和延迟控制器队列的性能etcd 的性能进程状态:文件系统...

MySQL DBA 常用工具 SQL

MySQL DBA 常用工具 SQL

【前言】本篇文章介绍一些 MySQL 管理的实用语句及适用的场景。SQL 基于 MySQL 5.7 版本。1. 长事务事务长时间未提交,即使状态为Sleep也可能造成一些锁等待的问题,使用该查询可以查...

C++ 编程:程序组成部分 & 函数 & 输入

C++ 编程:程序组成部分 & 函数 & 输入

程序结构首先从一个最简单的程序来看 C++ 程序结构:第一部分:#include <iostream> 专业名词叫:预处理器编译指令 其实效果就类似于导包; 第二部分:main() 程序的...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。