全局事务标识符(GTID)是创建的唯一标识符,并且与在原始服务器(主服务器)上提交的每个事务相关联。该标识符不仅对于其起源的服务器是唯一的,而且在给定复制设置中的所有服务器之间也是唯一的。所有交易和所有GTID之间都存在一对一的映射。
GTID表示为一对坐标,并用冒号(:)分隔,如下所示:
GTID = source_id:transaction_id
该source_id标识的原始服务器。通常,服务器 server_uuid用于此目的。Transaction_id是通过在事务提交在此服务器上的顺序确定一个序列号; 例如,要提交的第一个事务具有1其 transaction_id,并且被分配一个相同的始发服务器上被提交第十交易transaction_id的 10。事务不可能0在GTID中具有序列号。例如,最初要在服务器上使用UUID提交的第二十三笔交易 3E11FA47-71CA-11E1-9E33-C80AA9429562具有以下GTID:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
此格式用于在语句的输出SHOW SLAVE STATUS以及二进制日志中表示GTID 。在使用mysqlbinlog 查看日志文件–base64-output=DECODE-ROWS 或从的输出中,也可以看到它们 SHOW BINLOG EVENTS。
正如在诸如SHOW MASTER STATUS或 的语句的输出中所写, SHOW SLAVE STATUS源自同一服务器的一系列GTID可以折叠为单个表达式,如此处所示。
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
只是显示的例子代表了第一个通过MySQL服务器,其上的第五个交易始发 server_uuid的 3E11FA47-71CA-11E1-9E33-C80AA9429562。
在MySQL 5.6.6和更高版本中,此格式还用于提供START SLAVE选项SQL_BEFORE_GTIDS和 所需的参数SQL_AFTER_GTIDS。
GTID集
GTID集是一组全局事务标识符,如下所示:
gtid_set:
uuid_set [, uuid_set] ...
| ''
uuid_set:
uuid:interval[:interval]...
uuid:
hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh
h:
[0-9|A-F]
interval:
n[-n]
(n >= 1)
GTID集在MySQL服务器中以多种方式使用。例如,由gtid_executed和 gtid_purged系统变量存储的值 表示为GTID集。此外,功能 GTID_SUBSET()和 GTID_SUBTRACT()要求GTID集作为输入。
GTID始终保留在主机和从机之间。这意味着您始终可以通过检查其从属日志来确定任何从属服务器上应用的任何事务的源。另外,一旦在给定服务器上提交了具有给定GTID的事务,该服务器将忽略具有相同GTID的任何后续事务。因此,在主服务器上提交的事务最多可以在从服务器上应用一次,这有助于确保一致性。
使用GTID时,从站不需要任何非本地数据,例如主机上文件的名称和该文件中的位置。直接从复制数据流中获取用于与主服务器同步的所有必要信息。从数据库管理员或开发人员的角度来看,GTID完全取代了先前为确定启动,停止或恢复主从节点之间的数据流所需的文件偏移对。这意味着,当您使用复制GTIDs,你并不需要(或希望)包括 MASTER_LOG_FILE或 MASTER_LOG_POS在选项 CHANGE MASTER TO用于指示从属从给定主复制的语句;代替这些选项,仅需启用MASTER_AUTO_POSITIONMySQL 5.6.5中引入的 选项。有关使用基于GTID的复制配置和启动主服务器和从服务器的确切步骤,请参见第17.1.3.2节“使用GTID 设置复制”。
GTID的生成和生命周期包括以下步骤:
事务在主服务器上执行并提交。
使用主服务器的UUID和该服务器上尚未使用的最小非零事务序列号为该事务分配GTID;GTID将被写入主数据库的二进制日志中(紧接在日志中事务本身之前)。
在将二进制日志数据传输到从站并存储在从站的中继日志中之后(使用此过程使用的已建立机制- 有关详细信息,请参见 第17.2节“复制实现”),从站将读取GTID并设置其gtid_next系统值变量作为此GTID。这告诉从站必须使用该GTID记录下一个事务。
从属设备gtid_next在会话上下文中设置。
从站检查以确保尚未使用该GTID在其自己的二进制日志中记录事务。当且仅当未使用此GTID时,从属方才写入GTID并应用事务(并将事务写入其二进制日志)。通过首先读取和检查事务的GTID,在处理事务本身之前,从属不仅保证没有任何具有该GTID的先前事务已应用于从属,而且还确保没有其他会话已经读取此GTID但尚未提交相关交易。换一种说法,
因为gtid_next不为空,所以从属服务器不会尝试为该事务生成GTID,而是将存储在此变量中的GTID(即从主服务器获取的GTID)写入其二进制日志中紧接在事务之前。




