栏目头部广告

MySQL GTID全局事物标识

一、GTID详细介绍

1.1 GTID概述

(1)全局事物标识:global transaction identifieds。

(2)GTID事物是全局唯一性的,且一个事务对应一个GTID。

(3)一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。

(4)GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。

(5)MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。

(6)在传统的slave端,binlog是不用开启的,但是在GTID中,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

1.2 GTID的组成部分

GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。 GTID 实际上 是由 UUID+TID 组成的。其中 UUID 是一个 MySQL 实例的唯一标识。TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。下面是一个GTID的具体形式:a47892ad-e207-11e9-bd0d-5254003519fe:178

一组连续的事务可以用 - 连接的事务序号范围表示。例如:a47892ad-e207-11e9-bd0d-5254003519fe:1-178

GTID 集合可以包含来自多个 MySQL 实例的事务,它们之间用逗号分隔。如果来自同一 MySQL 实例的事务序号有多个范围区间,各组范围之间用冒号分隔。例如:

e6954592-8dba-11e6-af0e-fa163e1cf111:1-5:11-18,e6954592-8dba-11e6-af0e-fa163e1cf3f2:1-27

# 查询当前事务执行数
mysql> show master status\G

MySQL GTID全局事物标识(图1)

mysql> show slave status\G

MySQL GTID全局事物标识(图2)

1.3 GTID比传统复制的优势

(1)更简单的实现failover,不用以前那样在需要找log_file和log_Pos。

(2)更简单的搭建主从复制。

(3)比传统复制更加安全。

(4)GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。

1.4 GTID的工作原理

(1)master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。

(2)slave端的i/o 线程将变更的binlog,写入到本地的relay log中。

(3)sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。

(4)如果有记录,说明该GTID的事务已经执行,slave会忽略。

(5)如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。

(6)在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

要点:

A. slave在接受master的binlog时,会校验master的GTID是否已经执行过(一个服务器只能执行一次)。

B. 为了保证主从数据的一致性,多线程只能同时执行一个GTID。

二、开启GTID方法

show variables like '%gtid_mode%';

MySQL GTID全局事物标识(图3)

set global enforce_gtid_consistency=on;
set global gtid_mode=off;
set global gtid_mode=off_permissive;
set global gtid_mode=on_permissive;
set global gtid_mode=on;

MySQL GTID全局事物标识(图4)

gtid_mode这个参数有四个值,一定要按照如下顺序进行gtid_mode的开启操作(关闭是相反的)。

(1)off:生成的是匿名事务,slave也只能应用匿名事务。

(2)off_permissive:生成的是匿名事务,slave可以应用匿名事务和GTID事务。

(3)on_permissive:生成的是GTID事务,slave可以应用匿名事务和GTID事务。(这一步操作完成后,主节点二进制日志就会变成gtid模式)

(4)on:生成的是GTID事务,slave也只能应用GTID事务。

OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON.

【注】搭建主从同步时,当从库Slave_IO_Running: Yes  Slave_SQL_Running: No时,先关闭主库gtid,然后再开启。

作者:UStarGao
链接:https://www.starcto.com/mysql/114.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

文章页广告

随便看看

栏目底部广告
`