数据库
首页 > 数据库> > mysql原理~GTID综合

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
   主从都需要执行
   实现步骤:
   1. 所有的Server执行
      set @@global.enforce_gtid_consistency = warn; 
      特别注意: 这一步是关建的一步使用不能出现警告。
  2.所有的server上执行:
     set @@global.enforce_gtid_consistency = on;
  3.所有的Server上执行(不关心最先最后,但要执行完):
     set @@global.gtid_mode = off_permissive;
  4. 执行:
    set @@global.gtid_mode=on_permissive; 
    实质在这一步骤生的日志都是带GTID的日志了,这个步骤号称是不关心任何节点,但从实管理上推荐在slave上先执行,然后再去master上执行。
  5. 确认传统的binlog复制完毕,该值为0
    show status like 'ongoing_anonymous_transaction_count';
    需要所有的节点都确认为0.
  6. 所有节点进行判断 show status like 'ongoing_anonymous_transaction_count'; 为零
      所有的节点也可以执行一下: flush logs; 用于切换一下日志。
  7. 所有的节点启用gtid_mode
     set @@global.gtid_mode=on
  8. 把gtid_mode = on相关配置写入配置文件
      gtid_mode=on
      enforce_gtid_consistency=on
  9. 启用Gtid的自动查找节点复制:
     stop slave;
     change master to master_auto_position=1;
     start slave;
     注意点:1 只有版本大于5.7.6的mysql才能支持在线从传统复制切换到GTID复制
                 2 关于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
                 3 GTID在线切换不必考虑主从是否一致性生成GTID日志,因为并不影响同步,只有最后一步才会真正的采用GTID同步
   补充
    1 GTID和并行复制是两个东西,即便不开GTID,binlog也会包含并行复制所需要的东西
    2 跨版本开启GTID复制有可能有问题,不推荐这么玩,先用传统复制,然后在线进行切换
    3 reset master 会清空 gtid_purged gtid_executed 内容,谨慎操作
    4 mysqldump 对于GTID模式下的导出 包含两部分操作
        1 set_log_bin = 0 对于导入操作不生成本地的GTID操作
        2 手动执行set global gitd_purged = ‘ ’ 导入被删除的事务集合,更新目的库gtid_purged+gtid_executed变量
        3 如果不想导出GTID的相关信息 可以增加 --set-gtid-purged=OFF(不推荐)
        4 如果采用导出第一次搭建从库,请先执行reset master 清空GTID 相应表,防止之前遗留导致获得错误的GTID集合
   5 master_auto_position 是如何寻找位置的
        1 从库发送gtid_executed集合到master
        2 master根据从库发送的gtid_executed扫描binlog
        3 从最新binlog开始向前扫描,根据每个binlog开头的Previous-GTIDs的记录判定是否为需要记录,以此类推
        4 寻找到相应的binlog发送给salve
   6  高可用切换

      1 如果在高可用主从切换,旧从指向新主后,不用再提供binlog和postion,根据以上扫描机制就能获取最新数据
       2 记住高可用下一定要在新主应用完relay-log后进行reset master。然后新master的binlog就包含了应用旧主的binlog内容,保住旧从指向新主不会出现数据缺失导致错误的情况

       3 切换完成后旧主通过show slave status 就会发现有多个GTID记录,包含旧主和新主

标签:binlog,executed,set,master,GTID,mysql,原理,gtid
来源: https://www.cnblogs.com/danhuangpai/p/11332555.html