GTIDTree

GTID技术研究

获取mysql实例的uuid

GTID
          GTID(Global Transaction ID)是对于一个已经提交事务的编号,并且是全局唯一的编号。

          在源(主)服务器上提交的每个事务,将创建和其相关联的唯一标识符的全局事物标识符。此标识符
      不但是唯一的,而且在所有的复制从库中都是唯一的。所有事物和所有GTID之间都有一对一的映射关系

          GTID实际上由UUID + TID组成。UUID是Mysql实例的唯一标识,保存在mysql数据库目录下的
      auto.cnf文件里。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。

      例如GTID:
          3E11FA47-71CA-11E1-9E33-C80AA9429562:23

      在同一个集群内,每个MySQL实例的server_uuid必须唯一,否则同步时,会造成IO线程不停的中断,
      重连。在通过备份恢复数据时,一定要将var目录中的auto.cnf删掉,让MySQL启动时自己生成uuid。

      如果事务是通过SQL线程回放relay-log时产生,那么GTID就直接使用binlog里的了。在MySQL 5.6中
      不用担心binlog里没有GTID,因为如果从库开启了GTID模式,主库也必须开启,否则IO线程在建立连
      接的时候就中断了。5.6的GTID对MySQL的集群环境要求是非常严格的,要么主从全部开启GTID模式,要
      么全部关闭GTID模式 
GTID的工作原理
          1)master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
          2)slave端的i/o线程将变更的binlog写入到本地的relay log中。
          3)sql线程从relay log中获取GTID,然后对比slave端的binlog是否存在记录。
          5)如果有记录,说明事务已经执行完毕,slave会忽略。
          6)如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
GTID相比传统复制的优势,GTID找点儿:
           
         在未开启GTID模式的情况下,从库用(File_name和File_pos)二元组标识执行到的位置。
      START SLAVE时,从库会先向主库发送一个BINLOG_DUMP命令,在BINLOG_DUMP命令中指定
      File_name和File_pos,主库就从这个位置开始发送binlog。

         在开启GTID模式的情况下,如果指定MASTER_AUTO_POSITION=1。START SLAVE时,从库会计
      算Retrieved_Gtid_Set和Executed_Gtid_Set的并集(通过SHOW SLAVE STATUS可以查看),然
      后把这个GTID并集发送给主库。主库会使用从库请求的GTID集合和自己的gtid_executed比较,把从库
      GTID集合里缺失的事务全都发送给从库。如果从库缺失的GTID,已经被主库pruge了呢?从库报1236
      错误,IO线程中断