Mysql GTID全局事务ID是Mysql 主从复制的一种同步方式。
首先说下什么是全局事务,即在Mysql 二阶段提交过程中产生的事务,到从库接收binlog日志信息,从库写入数据库,确认给主库然后主库提交事务的整个过程则是全局事务,如图所示:
GTID由Mysql 的Server id 和事务id组成,其中事务id是由mysql插入或者新增时的事务id生成。
GTID = server_uuid:transaction_id
查询mysql的uuid的sql
show VARIABLES like '%server_uuid%'
GTID的示例:
ae0a8ec4-6fc1-11e9-821a-4ccc6a4d7344:2:10
GTID同步流程:
- 主库binglog dump线程将修改的sql和全局事务id GTID写入二进制文件binlog。GTID=UUID+事务ID
- 从库io线程读取主库binlog文件,并写入relay log文件中
- 从库sql线程读取relay log
- 从库sql线程比对binlog日志是否存在相同的GTID,不存在并写入数据库中,存在跳过。
- 从库通知主库完成,主库确认commit。
GTID同步的优点
- GTID唯一,只会在服务器上执行一次,避免了主从的不一致。
- GTID不需要指定二进制文件名和位置。
- GTID都是连续的,保证了数据的一致性,零丢失。
GTID同步的缺点
- 主备执行引擎需要一致(这应该不是缺点)
- 不支持create table….select 语句复制(主库直接报错)
- 对于create temporary table 和 drop temporary table语句不支持
- 不支持 sal_slave_skip_counter
GTID开启参数
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1