从mysql5.6开始数据库添加了一个新特性:global transaction identifiers (GTIDs)--全局事务标识符。
通过gtids,mysql数据库对每一个成功执行的事务在日志中添加唯一标识。在基于GTIDS的复制中,备机可以不通过指定主节点的日志和位置来获取数据,而是通过主备节点的transaction id来判断是否同步,同时决定需要抓取的数据。
GTID的格式为source_id:transaction_id
source_id唯一表示了一台server,通过函数server_uuid可以获取。
transaction_id用来标记在server中的事务串行运行的ID。
开启基于GTIDS复制的步骤如下:
基于前言的"简单搭建replicaition环境"
http://blog.csdn.net/wjf870128/article/details/45149573
1.在主备节点的配置文件/etc/my.cnf中加入
log_bin = mysql-bin
binlog_format = row
gtid_mode=ON
log-slave-updates
enforce-gtid-consistency
重启主备节点
注:
gtid_mode=ON
打开GTID复制模式;
log-slave-updates
备机在获取主节点日志应用的同时也记录到自己本机的binlog日志中;
enforce-gtid-consistency
开启严格的gtid格式。
2.将备节点指定到主节点的日志位置
mysql> CHANGE MASTER TO
> MASTER_HOST = 'mysql-rep01',
> MASTER_USER = 'repl',
> MASTER_PASSWORD = 'slavepass',
> MASTER_AUTO_POSITION = 1;
3.开启备节点slave
mysql>start slave;
4.在主节点运行sql后查看备节点slave状态
5.开启GTID复制模式的约束:
- 不支持非事务类型的存储引擎复制,如MyISAM;
- create table...select语句不支持,因为在基于row的复制中,该语句会备拆分为create和insert两件事务,并且会分配到相同的transaction id,会造成slave跳过相同transaction id而不同步的现象;
- 不支持临时表的使用;
- 无法使用sql_slave_skip_counter 跳过复制中出现的错误,可以在slave节点中指定变量gtid_executed来跳过相应的错误;
- 在mysql5.6.7以前的版本在运行mysql_upgrade的时候,如果开启gtid_mode=on的时候没有指定write_binlog=off会连接不上server。
参考 http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-restrictions.html