MySQL Binlog GTID

GTID标识了Binlog事务的全局唯一性,保证事务在集群的每个实例上有且只执行了一次。开启Binlog和GTID后,MySQL会为每个事务绑定一个GTID,该事务执行成功后,对应的GTID会被记录在Binlog中。因此MySQL可以通过GTID的状态来判断状态机状态,在搭建复制时,根据GTID判断上下游复制节点的事务执行状态,上游就可以将下游没有的事务同步到下游。

开启GTID需要设置enforce_gtid_consistency=ON 和gtid_mode=ON,前者保证了该语句能安全的以GTID事务的形式记录,举个例子,有些表不支持事务操作,若用GTID记录了对该表的操作,若语句执行失败,又无法回滚到执行前的状态,那么GTID无法决定该语句的原子性了,也就无法通过GTID判断主从节点状态是否一致。此外gtid_mode还有几种其他的参数:ON_PERMISSIVE、OFF_PERMISSIVE、OFF,描述了主从节点产生的Binlog事务是否记录GTID。

本文内容基于 MySQL Community 8.0.13 Version

意义

在上下游复制时用到GTID,下游将自己的GTID集合发给上游,上游据此同步数据。在change master语句中可以指定使用GTID复制。使用GTID复制需要source的gtid_mode=ON,replica的gtid_mode不是OFF,replica在change master语句中设置MASTER_AUTO_POSITION=1,比如:

  • change master to

CHANGE MASTER TO MASTER_HOST='', MASTER_USER='', MASTER_PASSWORD='', MASTER_AUTO_POSITION=1, MASTER_PORT=, MASTER_HEARTBEAT_PERIOD=;