简介
GTID(Global Transaction IDentifier),全局事务id,此标识符不仅在主服务器中是唯一的,而且在所有复制主库的从库中也是唯一的。
格式
GTID = source_id:transaction_id
-
source_id
:用于标识MySQL实例,即MySQL服务器唯一的server_uuid
,这个id在初始化数据库会生成并保存在数据目录下的auto.cnf
文件中。 -
transaction_id
是一个序列号,由主服务器提交的事务的顺序决定。
优势
- GTID是连续的,保证数据的一致性
- 更简单实现故障转移,不需要再去找binlog位置
- 比传统的主从复制更安全
使用GTID的主从复制原理
- 事务在主服务器上执行并提交。此客户端事务被分配一个GTID,该GTID由主服务器的UUID和此服务器上尚未使用的最小非零事务序列号组成。GTID被写入主服务器的二进制日志
- 从库IO线程请求主库Binlog日志,主库Dump线程传送给从库保存在从库的中继日志中,读取这个GTID的值并设置
gtid_next
变量,即告诉从库,下一个要执行的GTID - 从库SQL线程从中继日志读取GTID,然后对比从库的binlog是否有该GTID,如果有说明已经执行会忽略,如果没有就执行该事务,读取执行之前还会检查其他的session是否持有该GTID确保不会重复执行。
设置GTID的主从复制
第一步: 在主从库修改配置文件
gtid_mode=ON # 启用GTID类型,否则就是普通的复制架构
enforce-gtid-consistency=true # 强制GTID的一致性
log-slave-updates=1 # slave更新是否记录日志,这个参数可以不加
第二步:启动主从复制
mysql> CHANGE MASTER TO
> MASTER_HOST = host,
> MASTER_PORT = port,
> MASTER_USER = user,
> MASTER_PASSWORD = password,
> MASTER_AUTO_POSITION = 1; # 不需要再填写主库的binlog日志位置,直接可以自动定位。
注入空事务
由于GTID必须是连续的,正常情况下同一个服务器产生的GTID是不会存在空缺的,所以不能简单skip掉一个事务,只能通过注入空事务的方法替换掉一个实际操作事务
mysql> STOP SLAVE;
mysql> SET gtid_next='xxxxxxx:N';
mysql> BEGIN;COMMIT;
mysql> SET gtid_next='AUTOMATIC';
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
参考文档: