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/

怎么开启查看事务idjava 事务id是什么_服务器

怎么开启查看事务idjava 事务id是什么_数据_02

 在从数据库上执行如下命令:

mysql> change master to master_host='192.168.130.135',master_user='sync',master_password='123456',master_auto_position=1;


#执行开始主从复制的命令
mysql> start slave;

怎么开启查看事务idjava 事务id是什么_数据_03

 使用 show slave status \G; 查看复制情况:

怎么开启查看事务idjava 事务id是什么_怎么开启查看事务idjava_04

怎么开启查看事务idjava 事务id是什么_GTID_05

测试主从库是否数据一致,在主库的mysql库下的test表插入一条数据,在查看从库下test表的数据情况:

主库插入数据前的状态:

怎么开启查看事务idjava 事务id是什么_mysql_06

从库的状态:

怎么开启查看事务idjava 事务id是什么_GTID_07

首先在主库插入数据和查看数据

怎么开启查看事务idjava 事务id是什么_服务器_08

查看从库的数据是否和主库一致:

怎么开启查看事务idjava 事务id是什么_GTID_09

至此GTID复制搭建成功。 

GTID复制和传统复制的切换方法:

将GTID切换为传统复制模式:

1.首先查看主从库的状态:

show master status \G;

show slave status \G;

怎么开启查看事务idjava 事务id是什么_GTID_10

怎么开启查看事务idjava 事务id是什么_GTID_11

 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;

怎么开启查看事务idjava 事务id是什么_怎么开启查看事务idjava_12

 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;

怎么开启查看事务idjava 事务id是什么_怎么开启查看事务idjava_13

 6.测试是否切换成功。

首先向主库的mysql库下的test表插入一条数据:

insert into test values(37,'jack13');

怎么开启查看事务idjava 事务id是什么_GTID_14

查看从库,这条数据是否同步成功;

怎么开启查看事务idjava 事务id是什么_mysql_15

怎么开启查看事务idjava 事务id是什么_mysql_16

可以发现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;

怎么开启查看事务idjava 事务id是什么_mysql_17

5.在从库上执行如下命令,确认从库上是否还有等待的事务,如果为0,代表没有等待的事务。

show global status like 'ongoing_anonymous_%';

怎么开启查看事务idjava 事务id是什么_GTID_18

6.在主从库上同时设置GTID模式为on.

set global gtid_mode=on;

查看目前主从库的gtid参数,看是否都是开启的

show variables like '%gtid%';

怎么开启查看事务idjava 事务id是什么_mysql_19

7.把传统复制模式改为GTID复制模式,首先要停止传统的复制模式,执行 stop slave命令。然后再执行change master命令:

stop slave;

change master to master_auto_position=1;

start slave;

怎么开启查看事务idjava 事务id是什么_服务器_20

此时往主库的库test下的表插入一条数据,查看从库的test表下是否数据同步成功:

怎么开启查看事务idjava 事务id是什么_mysql_21

怎么开启查看事务idjava 事务id是什么_服务器_22

可以看到数据同步成功,在从库 执行如下 show slave status \G;查看GTID的值

怎么开启查看事务idjava 事务id是什么_服务器_23

发现GTID的值增加了,证明切换为了GTID复制模式。