开启GTID,需要在my.cnf指定以下参数,或在启动实例时命令行指定:
gtid-mode=on
enforce-gtid-consistency=1
log-slave-updates=1
log-bin=
在5.6版本开启GTID时必须开启log-slave-updates,因为GTID相关信息是存放在内存的,重启以后就丢失了,必须要从binlog里找到最新应用到的GTID;
在5.7版本由于引入了mysql.gtid_executed表,GTID信息存放在这个数据表里,那么重启之后就不再需要去读取binlog来获取GTID相关信息了。同时通过gtid_executed_compression_period参数控制执行了多少个事务以后,对mysql.gtid_executed表进行压缩,以免大量的GTID信息占用过多存储空间。
开启GTID后有如下限制:
1.不允许在同一个事务内对事务表和非事务进行DML操作,例如在同一个事务内先update innodb表,然后update myisam表。因为GTID强制每一个GTID对应一个事务,而在同一个事务内既操作innodb表又操作myisam,就会产生两个GTID;
2.不允许CREATE TABLE … SELECT语句,首先这种语句对于statement格式的binlog是不安全的;而对于row格式的binlog,这种语句在binlog实际是分成两个event进行记录的,一个记录create创建操作,一个记录insert操作,那么就有可能这两个操作是对应到同一个GTID上,而当将这两个拥有相同GTID的event传到从库时,从库就会忽略拥有相同GTID的insert操作,造成数据丢失;
3.CREATE TEMPORARY TABLE和DROP TEMPORARY TABLE不允许在事务内执行,只有在事务以外并且autocommit=1才能正常执行;
4.不支持sql_slave_skip_counter,如果需要跳过事务,可以用以下方法:
set @@session.gtid_next='需要跳过的事务gtid'
begin;commit;
set session gtid_next=automatic;