什么是GTID呢, 简而言之,就是全局事务ID(global transaction identifier ),最初由google实现,官方MySQL在5.6才加入该功能。
GTID是事务提交时创建分配的唯一标识符,给每个事务做一个唯一的编号,所有事务均与GTID一一映射。
GTID是事务提交时创建分配的唯一标识符,给每个事务做一个唯一的编号,所有事务均与GTID一一映射。
MySQL5.7的GTID实现
首先搭建普通模式的主从
之后添加如下参数
gtid_mode = on
log-slave-updates = on
enforce-gtid-consistency = on
在线将GTID模式复制改为传统模式复制
1、将主库设置为read_only,查看复制的位置
(root@localhost) [(none)]> set @@global.read_only = on;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000007 | 688 | | | 766d5362-c923-11e6-85b5-000c29de38de:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
2、在从库上关闭基于GTID模式的复制,调整为传统复制
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> change master to master_auto_position=0,master_log_file='mysql-bin.000007',master_log_pos=688;
Query OK, 0 rows affected (0.01 sec)
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)
3、在每一台服务器上设置GTID模式为ON_PERMISSIVE
(root@localhost) [(none)]> set @@global.gtid_mode=on_permissive;
Query OK, 0 rows affected (0.01 sec)
4、在每一台服务器上设置GTID模式为OFF_PERMISSIVE
(root@localhost) [(none)]> set @@global.gtid_mode=off_permissive;
Query OK, 0 rows affected (0.02 sec)
5、等待所有的服务器上的变量@@global.gtid_owned为空,它表示正在由线程执行的全局GTID集合
6、等待所有的SLAVE上都复制完成匿名事务
7、在每一台服务器上关闭GTID
(root@localhost) [(none)]> set @@global.gtid_mode=off;
Query OK, 0 rows affected (0.02 sec)
8、修改配置文件,即使重启数据库,配置也是生效的
gtid_mode = off
enforce-gtid-consistency = off
9、将主库的read_only设置为off
1、将主库设置为read_only,查看复制的位置
(root@localhost) [(none)]> set @@global.read_only = on;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000007 | 688 | | | 766d5362-c923-11e6-85b5-000c29de38de:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
2、在从库上关闭基于GTID模式的复制,调整为传统复制
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> change master to master_auto_position=0,master_log_file='mysql-bin.000007',master_log_pos=688;
Query OK, 0 rows affected (0.01 sec)
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)
3、在每一台服务器上设置GTID模式为ON_PERMISSIVE
(root@localhost) [(none)]> set @@global.gtid_mode=on_permissive;
Query OK, 0 rows affected (0.01 sec)
4、在每一台服务器上设置GTID模式为OFF_PERMISSIVE
(root@localhost) [(none)]> set @@global.gtid_mode=off_permissive;
Query OK, 0 rows affected (0.02 sec)
5、等待所有的服务器上的变量@@global.gtid_owned为空,它表示正在由线程执行的全局GTID集合
6、等待所有的SLAVE上都复制完成匿名事务
7、在每一台服务器上关闭GTID
(root@localhost) [(none)]> set @@global.gtid_mode=off;
Query OK, 0 rows affected (0.02 sec)
8、修改配置文件,即使重启数据库,配置也是生效的
gtid_mode = off
enforce-gtid-consistency = off
9、将主库的read_only设置为off
在线将传统模式复制改为GTID模式复制
1、在每一台服务器上设置ENFORCE_GTID_CONSISTENCY=WARN
(root@localhost) [(none)]> set @@global.enforce_gtid_consistency=warn;
Query OK, 0 rows affected (0.00 sec)
这一步设置之后,使得所有事务都允许违反gtid的一致性,在进行下一步之前,需要确保在错误日志中无任何警告
2、在每一台服务器上设置ENFORCE_GTID_CONSISTENCY=ON
(root@localhost) [(none)]> set @@global.enforce_gtid_consistency=on;
Query OK, 0 rows affected (0.00 sec)
这步是确保所有的事务都不能违反GTID的一致性
3、在每一台服务器上设置GTID_MODE=OFF_PERMISSIVE
这步是新的事务是匿名的,同时允许复制的事务是GTID或匿名的
(root@localhost) [(none)]> set @@global.gtid_mode=off_permissive;
Query OK, 0 rows affected (0.04 sec)
4、在每一台服务器上设置GTID_MODE=ON_PERMISSIVE
(root@localhost) [(none)]> set @@global.gtid_mode=on_permissive;
Query OK, 0 rows affected (0.06 sec)
5、等待ONGOING_ANONYMOUS_TRANSACTION_COUNT状态值为0
在所有从库上查看
(root@localhost) [(none)]> show status like 'ongoing_anonymous_transaction_count';
+-------------------------------------+-------+
| Variable_name | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0 |
+-------------------------------------+-------+
1 row in set (0.01 sec)
6、在每一台服务器上设置GTID_MODE=ON
(root@localhost) [(none)]> set @@global.gtid_mode=on;
Query OK, 0 rows affected (0.06 sec)
7、此时复制还是基于Binlog位置的,可以通过将选项MASTER_AUTO_POSITION设置为1,将复制调整为基于GTID模式的复制
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> change master to master_auto_position=1;
Query OK, 0 rows affected (0.06 sec)
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
8、修改配置文件,即使重启数据库,配置也是生效的
gtid_mode = on
enforce-gtid-consistency = on
1、在每一台服务器上设置ENFORCE_GTID_CONSISTENCY=WARN
(root@localhost) [(none)]> set @@global.enforce_gtid_consistency=warn;
Query OK, 0 rows affected (0.00 sec)
这一步设置之后,使得所有事务都允许违反gtid的一致性,在进行下一步之前,需要确保在错误日志中无任何警告
2、在每一台服务器上设置ENFORCE_GTID_CONSISTENCY=ON
(root@localhost) [(none)]> set @@global.enforce_gtid_consistency=on;
Query OK, 0 rows affected (0.00 sec)
这步是确保所有的事务都不能违反GTID的一致性
3、在每一台服务器上设置GTID_MODE=OFF_PERMISSIVE
这步是新的事务是匿名的,同时允许复制的事务是GTID或匿名的
(root@localhost) [(none)]> set @@global.gtid_mode=off_permissive;
Query OK, 0 rows affected (0.04 sec)
4、在每一台服务器上设置GTID_MODE=ON_PERMISSIVE
(root@localhost) [(none)]> set @@global.gtid_mode=on_permissive;
Query OK, 0 rows affected (0.06 sec)
5、等待ONGOING_ANONYMOUS_TRANSACTION_COUNT状态值为0
在所有从库上查看
(root@localhost) [(none)]> show status like 'ongoing_anonymous_transaction_count';
+-------------------------------------+-------+
| Variable_name | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0 |
+-------------------------------------+-------+
1 row in set (0.01 sec)
6、在每一台服务器上设置GTID_MODE=ON
(root@localhost) [(none)]> set @@global.gtid_mode=on;
Query OK, 0 rows affected (0.06 sec)
7、此时复制还是基于Binlog位置的,可以通过将选项MASTER_AUTO_POSITION设置为1,将复制调整为基于GTID模式的复制
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> change master to master_auto_position=1;
Query OK, 0 rows affected (0.06 sec)
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
8、修改配置文件,即使重启数据库,配置也是生效的
gtid_mode = on
enforce-gtid-consistency = on
利用GTID模式快速改变主从复制关系
现在的复制模型为201为主,202,203为201的从
需要调整为201为主,202为201的从,203为202的从
1、停止203的复制
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
2、调整203的复制关系,修改复制源为202节点
(root@localhost) [(none)]> change master to master_host='192.168.1.202',master_port=3306,master_auto_position=1;
Query OK, 0 rows affected (0.06 sec)
3、启动203的复制
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
现在的复制模型为201为主,202,203为201的从
需要调整为201为主,202为201的从,203为202的从
1、停止203的复制
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
2、调整203的复制关系,修改复制源为202节点
(root@localhost) [(none)]> change master to master_host='192.168.1.202',master_port=3306,master_auto_position=1;
Query OK, 0 rows affected (0.06 sec)
3、启动203的复制
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql.gtid_executed表:GTID持久化的介质,MySQL启动阶段会读取这个表来获取gtid_executed变量的值。
gtid_executed变量(show global variables):MySQL数据库已经执行了哪些GTID事务,处于内存中。show slave status中的executed_gtid_set也取自这里。
gtid_purged变量(show global variables):由于BINLOG文件的删除(如purge binary logfiles或者超过expire_logs_days设置)已经丢失的GTID事务,同时在搭建备库的我们使用set global gtid_purged变量来提示MySQL哪些GTID事务我已经执行过了。