mysql原理~GTID综合教程
1 简介
就是全局事务ID(global transaction identifier ) 属于全局唯一
2 构成
uuid+transaction\_id
3 格式
7a07cd08-ac1b-11e2-9fcf-0010184e9e08:1-N
binlog SET @@SESSION.GTID\_NEXT= ''
4 概念和变量解读
1 Previous-GTIDs 可以看出,每个binlog开头都记录着从GTID开启到这个binlog之前的binlog文件GTID执行事务的总和,即便不开启GTID,也会记录
2 gtid\_executed表
1 状态:不可以手动更改
2 内容:已经执行过的事务GTID总和,RESET MASTER会清空此值
3 mysql5.6记录在内存中,所以需要开启中继日志记录进行持久化(GTID\_LOG\_EVENT)
mysql5.7 为一个innodb\_table实现持久化 从库就不需要开启中级日志了
4 触发更改内容(适用于gtid\_executed gtid\_purged变量)
1 set global gtid\_purged='' 常见于搭建从库
2 reset master 清空 executed表
3 gtid\_purged 状态:可以手动更改 内容:已经被删除的binlog的事务GTID,它是GTID\_EXECUTED的子集
4 gtid\_owned 状态:不可以手动更改 内容:当前执行的事务GTID
5 binlog\_gtid\_simple\_recovery 状态:可以手动更改 内容:这个选项设置为真,会提升mysql执行恢复的性能。因为这样mysql-server启动和binlog日志清理更快。该参数为真时,mysql-server只需打开最老的和最新的这2个binlog文件,gtid\_purged参数的值和 gtid\_executed 参数的值可以根据这些文件中的Previous\_gtids\_log\_event 或者 Gtid\_log\_event计算得出。这确保了当mysql-server重启或清理binlog时,只需打开2个binlog文件。默认为真.目的是针对binlog的lost\_gtid加快扫描操作
6 gtid\_executed\_compression\_period 状态:可以手动更改 内容:进行压缩,减少空间占用,默认值为1000,表示每执行1000个事务后进行一次压缩,针对gtid\_executed表的压缩
7 主从相关
1 Retrieved\_Gtid\_Set 接收到的GTID事务 注意接收到的GTID事务有可能不一致
2 Executed\_Gtid\_Set 已经执行的GTID事务包括自然同步和手动purge两部分
5 mysql 5.6开启GTID
gtid-mode = ON
enforce-gtid-consistency=1
log-slave-updates=1
binlog\_format=row
6 mysql 5.7.6在线开启GTID
主从都需要执行
实现步骤:
- 所有的Server执行
set @@global.enforce\_gtid\_consistency = warn;
特别注意: 这一步是关建的一步使用不能出现警告。
2.所有的server上执行:
set @@global.enforce\_gtid\_consistency = on;
3.所有的Server上执行(不关心最先最后,但要执行完):
set @@global.gtid\_mode = off\_permissive; - 执行:
set @@global.gtid\_mode=on\_permissive;
实质在这一步骤生的日志都是带GTID的日志了,这个步骤号称是不关心任何节点,但从实管理上推荐在slave上先执行,然后再去master上执行。 - 确认传统的binlog复制完毕,该值为0
show status like 'ongoing\_anonymous\_transaction\_count';
需要所有的节点都确认为0. - 所有节点进行判断 show status like 'ongoing\_anonymous\_transaction\_count'; 为零
所有的节点也可以执行一下: flush logs; 用于切换一下日志。 - 所有的节点启用gtid\_mode
set @@global.gtid\_mode=on - 把gtid\_mode = on相关配置写入配置文件
gtid\_mode=on
enforce\_gtid\_consistency=on - 启用Gtid的自动查找节点复制:
stop slave;
change master to master\_auto\_position=1;
start slave;
注意点:1 只有版本大于5.7.6的mysql才能支持在线从传统复制切换到GTID复制 - 关于gtid\_mode选项名词说明,控制新事物产生是什么模式
GTID\_MODE = OFF : 不产生Normal\_GTID,只接受来自master的ANONYMOUS\_GTID
GTID\_MODE = OFF\_PERMISSIVE : 不产生Normal\_GTID,可以接受来自master的ANONYMOUS\_GTID & Normal\_GTID
GTID\_MODE = ON\_PERMISSIVE : 产生Normal\_GTID,可以接受来自master的ANONYMOUS\_GTID & Normal\_GTID
GTID\_MODE = ON : 产生Normal\_GTID,只接受来自master的Normal\_GTID - GTID在线切换不必考虑主从是否一致性生成GTID日志,因为并不影响同步,只有最后一步才会真正的采用GTID同步
补充 - GTID和并行复制是两个东西,即便不开GTID,binlog也会包含并行复制所需要的东西
- 跨版本开启GTID复制有可能有问题,不推荐这么玩,先用传统复制,然后在线进行切换
- reset master 会清空 gtid\_purged gtid\_executed 内容,谨慎操作
- mysqldump 对于GTID模式下的导出 包含两部分操作
- set\_log\_bin = 0 对于导入操作不生成本地的GTID操作
- 手动执行set global gitd\_purged = ‘ ’ 导入被删除的事务集合,更新目的库gtid\_purged+gtid\_executed变量
- 如果不想导出GTID的相关信息 可以增加 --set-gtid-purged=OFF(不推荐)
- 如果采用导出第一次搭建从库,请先执行reset master 清空GTID 相应表,防止之前遗留导致获得错误的GTID集合
- master\_auto\_position 是如何寻找位置的
- 从库发送gtid\_executed集合到master
- master根据从库发送的gtid\_executed扫描binlog
- 从最新binlog开始向前扫描,根据每个binlog开头的Previous-GTIDs的记录判定是否为需要记录,以此类推
- 寻找到相应的binlog发送给salve
- 高可用切换
1 如果在高可用主从切换,旧从指向新主后,不用再提供binlog和postion,根据以上扫描机制就能获取最新数据
2 记住高可用下一定要在新主应用完relay-log后进行reset master。然后新master的binlog就包含了应用旧主的binlog内容,保住旧从指向新主不会出现数据缺失导致错误的情况
3 切换完成后旧主通过show slave status 就会发现有多个GTID记录,包含旧主和新主