整理gtid相关知识

什么是gtid

全局事务标识符(GTID)是主服务器创建的唯一标识符,一个gtid映射一个在主服务器上提交的事务。gtid不仅在主服务器上是唯一的,而且在被复制到的所有服务器上也是唯一的。

gtid的格式和存储

gtid表示为一组合成id:
uuid:tid
uuid:在gtid模式下会根据当时的时间等为每个服务器生成世界上唯一(100年以内)的id。
tid:当一个事务在主服务器上提交时会产生一个序列号,这个序列号一般是按序生成的。一般从1开始。
例如,最初要在服务器上使用UUID:3E11FA47-71CA-11E1-9E33-C80AA9429562 提交的第二十三项事务具有以下GTID:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23

gtid集

GTID集是包括一个或多个单个GTID或一系列GTID的集,如下所示:
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
表示第一至第五个被提交了的事务。
来自同一服务器的多个单个GTID或GTID范围也可以包含在单个表达式中,且GTID或范围用冒号分隔,如以下示例所示:
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-3:11:47-49

实现gtid模式下的数据同步

服务器信息:

主服务器IP:192.168.77.130
从服务器IP:192.168.77.131
mysql版本:5.7
实现平台:VMware(centOS7)

首先搭建主从服务器并开启gtid模式同步:

1.在主从服务器上分别安装mysql5.7。
2.分别创建同步用户repl,并在主服务器上授予从服务器复制权限:

create user 'repl'@'192.168.77.131' identified by 'root$123';
grant replication slave on *.* to 'repl'@'192.168.77.131' identified by 'root$123';
//创建一个用户‘repl’给从服务器并设置密码root$123,grant命令赋予从服务器复制的权限
flush privileges;//刷新MySQL的系统权限相关表

3.配置主从服务器的mysql配置文件:/etc/my.cnf,在[mysqld]下插入:

gtid-mode = ON 
enforce-gtid-consistency = ON

4.进入mysql同步服务器:

stop slave; 
start slave;

此时主从数据库一致。

有关gtid的参数

启动项:

1.gtid-mode:
控制是否启用基于GTID的日志记录和日志包含的事务类型。

2.enforce-gtid-consistency:
根据此变量的值,服务器仅允许执行可以使用GTID安全记录的语句,以此来实现GTID一致性。启用基于GTID复制之前,必须将此变量设置为 ON
OFF:允许所有事务违反GTID一致性。
ON:不允许任何交易违反GTID一致性。
WARN:允许所有事务违反GTID一致性,但是在这种情况下会生成警告。

上面两项都是写在配置文件中,启动时生效。可以在mysql中查看:
在这里插入图片描述
在这里插入图片描述

全局变量和会话变量

1.gtid_executed:
表示所有在服务器上已执行的事务的gtid集合。是全局变量。
查看全局变量:
在这里插入图片描述
2.gtid_next:
此变量用于指定是否以及如何获取下一个GTID。是会话变量。
gtid_next 可以采用以下任何值:
1)AUTOMATIC:使用下一个自动生成的全局事务ID。
2)ANONYMOUS:事务没有全局标识符,仅由文件和位置标识。
3)uuid:number格式。(即指定gtid为下一个事务)

3.gtid_purged
由服务器上已提交但服务器上任何二进制日志文件中不存在的所有事务的GTID组成。是一个GTID集。属于全局变量。属于gtid_purged的gtid不会被同步。

gtid的进一步研究

尝试修改从服务器获得的gtid

停止同步:

stop slave;

1.在主服务器上创建一个数据库repl,创建table aaa:
在这里插入图片描述
2.备份主服务器repl数据库并发送给从服务器:
在这里插入图片描述
在这里插入图片描述
3.查看并修改test1.sql中gtid,将第3条gtid设置为不执行:
在这里插入图片描述
在这里插入图片描述
4.进入从服务器mysql执行下面命令:

stop slave;
source /app/mysql/test1.sql
reset master;
change master to master_log_file='mysql-bin.000020', master_log_pos=335;
start slave;

这里可以将change master to master_log_file=‘mysql-bin.000020’, master_log_pos=335;
换成change master to master_auto_position=1;让服务器自动搜索位置。

5.查看aaa:
在这里插入图片描述
6.分析:
从服务器首先从source test1.sql得到了完整数据。但是我们手动修改了gtid_purged使得从服务器以为现在的同步只执行了第三条gtid,于是当与主服务器同步时会重新从第一条开始执行,跳过第三条继续后面的同步。(这里执行了第一条create table aaa;第二条插入aaa执行了,但是第三条bbb没有插入,后面的ccc也插入了。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值