1. 什么是GTID
从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。GTID (Global Transaction ID)是全局事务ID,由主库上生成的与事务绑定的唯一标识,这个标识不仅在主库上是唯一的,在MySQL复制环境内也是唯一的。
2. GTID格式及含义
GTID = source_uuid:transaction_id
source_uuid是发起事务服务器的server_uuid,是一个MySQL实例的唯一标识,可以通过show variables like 'server_uuid'
查看。transaction_id代表了该实例上已经提交的事务数量,是一个单调递增的序列号,从1开始,1-2代表第二个事务;第1-n代表n个事务。
GTID复制拓扑中,无论事务被复制了多少次,事务的GTID都保持不变。一旦某个事务在服务器上提交后,后续所有相同GTID的事务都会被忽略,这种机制可以有效避免重复复制的现象,保持数据一致。
示例1:7a7f2A47-71CA-11E1-9E33-00163e429562:1
含义: 7a7f2A47-71CA-11E1-9E33-00163e429562 是这个节点的server_uuid,1为这个节点上提交的第1个事务的事务号,如果提交了10个事务,GTID会是: 7a7f2A47-71CA-11E1-9E33-00163e429562:1-10
【如果有多个范围要表示,则事务编号的范围可以用冒号分隔】
示例2:7a7f2A47-71CA-11E1-9E33-00163e429562:1-3:11:47-49
含义:执行了源自7a7f2A47-71CA-11E1-9E33-00163e429562服务器的第1-3个事务、第11个事务、第47-49个事务
【GTID集还能表示来自不同数据源的事务集】
示例3:7a7f2A47-71CA-11E1-9E33-00163e429562:1-77439,82b6d927-81cc-11ee-9edf-00163e202091:1-98191
含义:执行了源自7a7f2A47-71CA-11E1-9E33-00163e429562服务器的第1-77439个事务和源自82b6d927-81cc-11ee-9edf-00163e202091服务器的第1-98191个事务
MySQL 8.3 创新版于 2024 年 1 月 16 号发布,该版本扩展了 MySQL
复制和组复制中使用全局事务标识(GTID)的格式,支持给 GTID 打标签,以支持识别事务组。此增强功能可以为特定事务组的 GTID
分配唯一标识。例如:包含数据操作的事务可以很容易地与管理操作产生的事务区分开来,只需要比较他们的 GTID。
带标签的格式
扩展后的 GTID 格式是source_id:<tag>:transaction_id
,其中 tag 是最长为 8 个字符的任意字符串。通过设置系统变量 gtid_next 的值为 automatic: 启用,或者设置 gtid_next 为 uuid::transaction_id 以将单个事务的 uuid 设置为任意值,并为其分配自定义标签。
3. GTID相关参数
查看关于gtid的系统参数:
mysql> show variables like '%gtid%';
+-----------------------------------+-----------------------------------------------+
| Variable_name | Value |
+-----------------------------------+-----------------------------------------------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed | be423c64-90c8-11ed-bf93-00163e0fcdea:1-1169392|
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |