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> show slave status\G
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%';
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;
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云平台推荐
随便看看
- 2021-11-02开源网盘系统nextcloud容器化部署
- 2021-06-25MySQL修改wait_timeout变量global生效session不生效
- 2021-02-21Docker创建与查看容器常用参数解读
- 2022-05-08Prometheus+Grafana监控Docker容器
- 2021-09-14Docker部署RabbitMQ集群并实现Haproxy代理