GTID即全局事务ID(global transaction ID),是一个已提交的事务的编号,并且是一个全局唯一的编号。Mysql5.6版本之后在主从复制类型上新加的一种复制类型。GTID是由source_id 和transaction_id组成的,GTID=source_id:transaction_id,其中source_id就是执行事务的主库的server-uuid值,server-uuid值是在mysql服务首次启动生成的,保存在数据库的数据目录中,在数据目录中有一个auto.conf文件,这个文件保存了server-uuid值(唯一的)。而事务ID则是从1开始自增的序列,表示这个事务是在主库上执行的第几个事务。
在基于GTID的复制中,首先从服务器会告诉主服务器已经在从服务器执行完了哪些事务的GTID值,然后主库会有把所有没有在从库上执行的事务,发送到从库上进行执行,并且使用GTID的复制可以保证同一个事务只在指定的从库上执行一次,这样可以避免由于偏移量的问题造成数据不一致。GTID使用 master_auto_position=1 代替了基于 binlog 和 position 号的主从复制搭建方式。可以知道事务在最开始是在哪个实例上提交的。
GTID复制搭建注意的事项:在主库和从库的配置文件 my.cnf 中需要设置的参数如下:并且主从库的server-id应该不一样。
server-id=1
log-bin=mysql-bin
binlog_format = row
gtid_mode=on
enforce_gtid_consistency=on
配置完参数,也创建了复制的用户,在这里我们的用户是sync用户,创建语句如下所示:
create user 'sync'@'192.168.130.%' identified by '123456';
grant replication slave on *.* to 'sync'@'192.168.130.%';
flush privileges;
使用mysqldump命令导出数据,命令如下:
mysqldump --single-transaction -uroot -p --master-data=2 --triggers --routines -A > /usr/local/data/backup/all-20181206.sql
#远程拷贝到从数据库
scp all-20181206.sql root@192.168.130.137:/usr/local/data/backup/
在从数据库上执行如下命令:
mysql> change master to master_host='192.168.130.135',master_user='sync',master_password='123456',master_auto_position=1;
#执行开始主从复制的命令
mysql> start slave;
使用 show slave status \G; 查看复制情况:
测试主从库是否数据一致,在主库的mysql库下的test表插入一条数据,在查看从库下test表的数据情况:
主库插入数据前的状态:
从库的状态:
首先在主库插入数据和查看数据
查看从库的数据是否和主库一致:
至此GTID复制搭建成功。
GTID复制和传统复制的切换方法:
将GTID切换为传统复制模式:
1.首先查看主从库的状态:
show master status \G;
show slave status \G;
2.其次先在从库中停掉主从复制,然后调整为传统复制模式,让 master_auto_position=0。执行如下的命令:
stop slave;
change master to master_auto_position=0,master_host='192.168.130.135',master_user='sync',master_password='123456',master_log_file='mysql-bin.000024',master_log_pos=194;
#完成上述命令后再次打开主从复制
start slave;
3.在主从服务器上同时调整GTID模式为on_permissive。
set global gtid_mode=on_permissive;
4.在主从服务器上同时调整GTID模式为off_permissive。
set global gtid_mode=off_permissive;
5.在主从服务器上同时关闭GTID功能。
set global enforce_gtid_consistency=off;
set global gtid_mode=off;
6.测试是否切换成功。
首先向主库的mysql库下的test表插入一条数据:
insert into test values(37,'jack13');
查看从库,这条数据是否同步成功;
可以发现GTID的值没有增加,证明切换为传统复制成功。
传统复制模式切换为GTID复制
1.在主从库上同时修改参数 enforce_gtid_consistency=warn,确保在error log中不会出现警告信息,如果有,需要先修复,才能往后继续执行。
mysql > set global enforce_gtid_consistency=warn;
2.在主从服务器上执行如下命令,保证GTID的一致性
set global enforce_gtid_consistency=on;
3.在主从服务器上执行如下命令,调整GTID的模式为off_permissive。
set global gtid_mode=off_permissive;
4.在主从服务器上执行如下命令,调整GTID的模式为on_permissive。
set global gtid_mode=on_permissive;
5.在从库上执行如下命令,确认从库上是否还有等待的事务,如果为0,代表没有等待的事务。
show global status like 'ongoing_anonymous_%';
6.在主从库上同时设置GTID模式为on.
set global gtid_mode=on;
查看目前主从库的gtid参数,看是否都是开启的
show variables like '%gtid%';
7.把传统复制模式改为GTID复制模式,首先要停止传统的复制模式,执行 stop slave命令。然后再执行change master命令:
stop slave;
change master to master_auto_position=1;
start slave;
此时往主库的库test下的表插入一条数据,查看从库的test表下是否数据同步成功:
可以看到数据同步成功,在从库 执行如下 show slave status \G;查看GTID的值
发现GTID的值增加了,证明切换为了GTID复制模式。