第一部分GTID概述1.1 背景与概念背景MySQL任何复制方式都是基于binlog方式进行的。从MySQL 5.6开始增加了GTIDGlobal Transaction ID全局事务ID特性作为传统基于二进制日志位置复制的替代方案。GTID的定义GTID是一个全局唯一的事务标识符用于标识在MySQL服务器上执行的每个事务。在基于GTID的复制中主库上提交的每个事务都会分配一个唯一的GTID从库使用这些GTID来跟踪哪些事务已经被应用。1.2 传统复制的局限性在基于位置的复制中需要手动指定MASTER_LOG_FILE和MASTER_LOG_POS来确定复制的起点。这种方式存在以下问题容易出错需要准确记录二进制日志文件名和位置难以维护当主库发生故障切换时需要重新确定复制位置不够直观无法直接知道哪些事务已经被复制1.3 GTID的优势简化复制管理不再需要指定二进制日志文件名和位置自动定位从库可以自动找到正确的复制起点更好的一致性确保主从数据的一致性更容易的故障切换主库故障时可以更容易地切换到新的主库更清晰的复制状态可以清楚地知道哪些事务已经被复制第二部分GTID的格式与存储2.1 单个GTID的格式GTID由两部分组成源服务器的UUID和事务序列号。格式UUID:transaction_id例如3E11FA47-71CA-11E1-9E33-C80AA9429562:23其中3E11FA47-71CA-11E1-9E33-C80AA9429562是源服务器的UUID23是该服务器上执行的第23个事务2.2 GTID集一个GTID集表示一组连续的事务。例如3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5表示UUID为3E11FA47-71CA-11E1-9E33-C80AA9429562的服务器上执行的第1到第5个事务。多个不连续的范围可以用逗号分隔3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5:7-102.3 mysql.gtid_executed表从MySQL 5.7开始引入了mysql.gtid_executed表来存储已经执行的GTID信息。这个表的作用是记录服务器上执行的所有GTID支持在没有二进制日志的情况下进行复制提供更可靠的GTID持久化机制第三部分GTID生命周期3.1 典型事务的GTID生命周期事务在主库上开始执行事务提交时系统分配一个GTIDGTID和事务一起写入二进制日志从库的I/O线程读取二进制日志将GTID和事务写入中继日志从库的SQL线程执行中继日志中的事务并将GTID记录到自己的gtid_executed集合中3.2 GTID分配GTID的分配有两种方式自动生成当gtid_next设置为AUTOMATIC时系统自动生成GTID手动指定可以通过设置gtid_next变量来手动指定GTID3.3 gtid_next系统变量gtid_next变量控制下一个事务使用的GTIDAUTOMATIC系统自动生成GTID默认值UUID:NUMBER手动指定GTIDANONYMOUS不使用GTID3.4 gtid_purged系统变量gtid_purged表示已经被清除的GTID集合。当二进制日志被清除时对应的GTID会被添加到gtid_purged中。第四部分GTID自动定位4.1 自动定位原理在基于GTID的复制中从库连接到主库时会发送自己已经执行的GTID集合gtid_executed。主库根据这个集合确定从哪个事务开始发送二进制日志。这个过程完全自动化不需要手动指定二进制日志文件名和位置。4.2 复制启动使用GTID复制时通过设置MASTER_AUTO_POSITION1来启用自动定位CHANGE MASTER TO MASTER