GTID介绍
从MySQL5.6开始增加GTID这个特性,Global Transaction ID,全局事务ID,用来强化主从数据库的一致性,故障恢复,以及容错能力,来替代传统的人工的主从复制;
有了GTID,在进行主备切换的时候,slave们可以自动在新的master上找到复制位置(position),大大简化了复杂复制集群的维护工作,减少了人为设置position的风险,减少了数据不一致性的风险;
**GTID的组成:**
GTID=server_uuid:transaction_id
server_uuid指的是MySQL的uuid,在第一次启动MySQL时生成,保存在auto.cnf中;
transaction_id是事务的id,是一个从1开始的自增计数,表示在这个主库上执行的第几个事务;
比如:
b6af5b5c-666f-11e9-bed3-000c29b85ea6:1,第一个事务
b6af5b5c-666f-11e9-bed3-000c29b85ea6:1-5,第1到第5个事务
**GTID复制的工作原理**
1. master在执行更新操作时,会在事务执行时生成一个GTID,然后把GTID一起记录到binlog中;
2. slave的IO线程去读取master的binlog变更,写入自己的relay-log中;
3. slave从relay-log中取出GTID,比较自己的binlog中是否有次GTID;
4. 如果slave的binlog中有此GTID,则说明该事务已经执行过,不再执行;
5. 如果slave的binlog中没有次GTID,则执行该事务,并记录到自己的binlog中;
**GTID复制的优点**
1. 传统的主从复制,需要手动指定binlog和position,这样比较麻烦,也很容易出错,在master的写操作频繁时,也很难确定position;在GTID复制下,只需要指定MASTER_AUTO_POSITION=1,MySQL就会通过内部机制,自动找点同步;
简单来说,就是简化了复制,因为position是实时更新的,不方便手工指定,所以,GTID可以自动找到position进行同步;
2. GTID支持基于库的多线程复制,在MySQL5.6以前,slave的复制是单线程的,只能一个事件一个事件进行;所以,我们可以把一个表放在一个库里,一个库一个线程,这样就可以实现多线程复制;但是,当只有一个库的时候,多线程复制是没有用的;
**GTID相关变量**
gtid_mode=on:开启GTID;
gtid_executed:当前实例上执行过的事务集合;