1.GTID的含义
- LiGlobal Transaction Identifier,全局事务标识
- 一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
- GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。
- 基于gtid的主从复制原理:每个mysql数据库上都有一个唯一uuid,每个事务生成一个id。gtid由上面两者组合: uuid+事务id
- 更简单的搭建主从复制。
- 比传统的复制更加安全。在传统的复制里面,当发生故障,需要主从切换,需要找到binlog和pos点,然后将主节点指向新的主节点,相对来说比较麻烦,也容易出错。在MySQL 5.6里面,不用再找binlog和pos点,我们只需要知道主节点的ip,端口,以及账号密码就行,因为复制是自动的,
- GTID是连续的没有空洞的,保证数据的一致性,零丢失
2.GTID工作原理
- 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
- binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
- sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
- 如果有记录,说明该GTID的事务已经执行,slave会忽略。
- 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
- 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
3.基于GTID的主从复制
此实验是基于position的主从复制的基础上做的
步骤一:在server1(master)上面进行配置
vim /etc/my.cnf
加入:开启gtid的信息
gtid_mode=ON
enforce-gtid-consistency=true
重启数据库:systemctl restart mysqld
步骤二:登录数据库
mysql -uroot -proot
mysql>show databases;
发现gtid_executed是空的
在 /var/lib/mysql 路径下,mysqlbinlog mysql-bin.000002 可以看到之前的全部操作
在 /var/lib/mysql 路径下 ,cat auto.cnf 查看此节点的uuid
重启数据库:systemctl restart mysqld
步骤三:在server2(slave节点)上面进行配置
vim /etc/my.cnf
加入:开启gtid的信息
gtid_mode=ON
enforce-gtid-consistency=true
systemctl restart mysqld
步骤四:配置完成后,此时登录数据库: mysql -uroot -p密码==
mysql> stop slave; ##先停止复制
mysql> CHANGE MASTER TO ##修改master信息
-> MASTER_HOST = '172.25.42.1',
-> MASTER_USER = 'repl',
-> MASTER_PASSWORD = 'Drn+19961126',
-> MASTER_AUTO_POSITION = 1; ##启用gtid,它是自动的
mysql> start slave;
mysql> show slave status\G ##查看状态,可以看到下面两个参数是空的
Retrieved_Gtid_Set:
Executed_Gtid_Set:
步骤五:在server1上面开始写数据
mysql> use nn
mysql> insert into usertb values ('user2','456');
mysql> insert into usertb values ('user3','789');
步骤六:在server2(从数据库)上面查看gtid的信息
mysql> show slave status\G;
mysql> use nn
mysql> select * from usertb;
步骤七:查看主数据库GTID
mysql> use mysql
mysql> select * from gtid_executed;
mysql> show master status;