一 简介
1 在主从首次同步时(master_auto_position=1),slave会通过gtid协议将自己已经执行的gtid set(@@global.gtid_executed)发给master,master比较后从首个未被执行的GTID事务开始主从同步
2 在每个binlog开头会记录已经执行过的gtid集合,这样的好处是解析binlog就能得到对应已执行过的最大集合
3 全局的执行gtid_executed是唯一的,适用于整个集群
4 一个集群存在多个主机gtid集合的最有可能情况有两个
1 是执行过类似MHA的切换 2 从库有数据写入
二 具体参数
gtid_mode=on
enforce-gtid-consistency=on #gtid的强约束
log-slave-updates=1 #5.6需要开启参数,因为gtid_executed是记录在文件中
三 相关表
1 gtid_purged 被删除的binlog事务集合
2 gtid_executed 已经执行过的事务集合
四 备份恢复
1 gtid_executed包含gtid_purged集合,如果想设置gtid_purged,gtid_executed必须设置为空.所以执行备份恢复时必须先清空gtid_executed
2 清空gtid_executed的办法就是reset master.当执行完reset masterm,set gtid_purged=''之后,gtid_executed的值也会同步,和手动设置gtid_purged的值一样
五 DUMP
1 dump导出GTID模式下的数据默认会设置语句set global gtid_pured=''; 所以记得dump的时候加上 --set-gtid-purged=off
六 在线转换
1 mysql 5.7版本支持由传统模式转换成GTID的在线切换,反之也能正常切换
七 跳过异常
stop slave; # 关闭 slave 复制
SET GTID_NEXT='$GTID_NO'; # 设置 GTID_NEXT 为复制出错的 GTID_NO
begin; commit; # 向 $GTID_NO 写入空事务
SET GTID_NEXT="AUTOMATIC"; # 重新设置 GTID_NEXT 为自动获取
start slave; # 启动 slave 复制