Mysql GTID全局事务ID是Mysql 主从复制的一种同步方式。

首先说下什么是全局事务,即在Mysql 二阶段提交过程中产生的事务,到从库接收binlog日志信息,从库写入数据库,确认给主库然后主库提交事务的整个过程则是全局事务,如图所示:

Mysql 全局事务

GTID由Mysql 的Server id 和事务id组成,其中事务id是由mysql插入或者新增时的事务id生成。

GTID = server_uuid:transaction_id
查询mysql的uuid的sql
show VARIABLES like '%server_uuid%'

Mysql UUID

GTID的示例:

 ae0a8ec4-6fc1-11e9-821a-4ccc6a4d7344:2:10

Mysql GTID全局事务ID

GTID同步流程:

  1. 主库binglog dump线程将修改的sql和全局事务id GTID写入二进制文件binlog。GTID=UUID+事务ID
  2. 从库io线程读取主库binlog文件,并写入relay log文件中
  3. 从库sql线程读取relay log 
  4. 从库sql线程比对binlog日志是否存在相同的GTID,不存在并写入数据库中,存在跳过。
  5. 从库通知主库完成,主库确认commit。

GTID同步的优点

  • GTID唯一,只会在服务器上执行一次,避免了主从的不一致。
  • GTID不需要指定二进制文件名和位置。
  • GTID都是连续的,保证了数据的一致性,零丢失。

GTID同步的缺点

  1. 主备执行引擎需要一致(这应该不是缺点)
  2. 不支持create table….select 语句复制(主库直接报错)
  3. 对于create temporary table 和 drop temporary table语句不支持
  4. 不支持 sal_slave_skip_counter

GTID开启参数

gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates   = 1