GTID

本文深入解析了GTID(Global Transaction Identifier)的概念及其在MySQL主从复制中的应用。GTID是一种确保数据一致性的机制,其格式为source_id:transaction_id,能够简化故障转移流程并提高复制安全性。文章详细介绍了GTID的生成、工作原理及如何设置GTID主从复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

GTID(Global Transaction IDentifier),全局事务id,此标识符不仅在主服务器中是唯一的,而且在所有复制主库的从库中也是唯一的。

格式

GTID = source_id:transaction_id
  • source_id:用于标识MySQL实例,即MySQL服务器唯一的server_uuid,这个id在初始化数据库会生成并保存在数据目录下的auto.cnf文件中。

  • transaction_id是一个序列号,由主服务器提交的事务的顺序决定。

优势

  • GTID是连续的,保证数据的一致性
  • 更简单实现故障转移,不需要再去找binlog位置
  • 比传统的主从复制更安全

使用GTID的主从复制原理

  1. 事务在主服务器上执行并提交。此客户端事务被分配一个GTID,该GTID由主服务器的UUID和此服务器上尚未使用的最小非零事务序列号组成。GTID被写入主服务器的二进制日志
  2. 从库IO线程请求主库Binlog日志,主库Dump线程传送给从库保存在从库的中继日志中,读取这个GTID的值并设置gtid_next变量,即告诉从库,下一个要执行的GTID
  3. 从库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;

参考文档:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值