GTID即全局事务标识符,是mysql5.7中用于唯一标识每个事务的编号,基于GTID的主从复制可以自动定位同步位点,避免了传统基于binlog文件和位置同步的繁琐操作,主从切换时也更加高效。GTID由源服务器的UUID和事务序号组成,在整个复制集群中全局唯一,不会重复。

GTID模式配置要点
在mysql5.7中开启GTID模式需要修改配置文件并重启服务,核心配置参数如下,所有参与复制的节点都需要配置。
核心配置参数
- gtid_mode:控制GTID模式的开启状态,可选值为OFF、OFF_PERMISSIVE、ON_PERMISSIVE、ON,生产环境建议直接设置为ON,开启完整的GTID功能。
- enforce_gtid_consistency:强制事务支持GTID一致性,设置为ON时,只有符合GTID规范的事务才能执行,避免产生不支持GTID的操作。
- server_id:每个mysql实例的唯一标识,集群内所有实例的server_id不能重复,建议设置为整数,范围在1到2^32-1之间。
- log_bin:开启binlog日志,GTID依赖binlog记录事务信息,必须设置为ON。
- log_slave_updates:从库是否将同步过来的事务记录到自己的binlog中,如果后续该从库会成为主库,需要设置为ON。
配置文件示例
以主库配置文件my.cnf为例,添加以下配置项:
[mysqld] server_id=1 gtid_mode=ON enforce_gtid_consistency=ON log_bin=mysql-bin log_slave_updates=ON binlog_format=ROW
从库的配置只需要修改server_id为不同的值即可,比如设置为2,其他参数和主库保持一致。修改完成后重启mysql服务使配置生效。
配置验证
重启服务后,可以登录mysql执行以下命令验证GTID是否开启成功:
-- 查看GTID相关状态 SHOW VARIABLES LIKE 'gtid_mode'; SHOW VARIABLES LIKE 'enforce_gtid_consistency'; -- 查看当前实例的UUID SELECT @@server_uuid;
如果gtid_mode显示为ON,enforce_gtid_consistency显示为ON,说明GTID模式配置成功。
基于GTID实现主从切换的完整流程
假设当前有主库A(server_id=1)和从库B(server_id=2),现在需要将主从角色切换,让B成为新主库,A成为新从库。
步骤1:确保主从数据同步完成
在切换前先确认从库B已经同步完主库A的所有数据,避免数据丢失。登录从库B执行以下命令:
SHOW SLAVE STATUSG
查看返回结果中的Slave_IO_Running和Slave_SQL_Running是否都为Yes,同时Seconds_Behind_Master为0,说明从库和主库数据完全一致。
步骤2:将原主库A设置为只读
为了避免切换过程中有新的写入操作,先登录原主库A执行以下命令设置为只读:
SET GLOBAL read_only=ON; -- 如果有超级权限的用户还需要设置super_read_only SET GLOBAL super_read_only=ON;
步骤3:等待从库B同步完剩余数据
再次在从库B执行SHOW SLAVE STATUSG,确认所有relay log都已经应用完成,没有延迟。
步骤4:将从库B提升为新主库
登录从库B,停止复制进程,然后关闭只读模式:
-- 停止复制 STOP SLAVE; -- 重置复制信息(可选,避免后续作为从库时残留旧配置) RESET SLAVE ALL; -- 关闭只读模式 SET GLOBAL read_only=OFF; SET GLOBAL super_read_only=OFF;
步骤5:将原主库A配置为新从库
登录原主库A,先关闭只读模式,然后配置复制指向新主库B:
-- 关闭只读模式 SET GLOBAL read_only=OFF; SET GLOBAL super_read_only=OFF; -- 配置复制指向新主库B,使用MASTER_AUTO_POSITION=1开启GTID自动定位 CHANGE MASTER TO MASTER_HOST='新主库B的IP地址', MASTER_PORT=3306, MASTER_USER='复制用户', MASTER_PASSWORD='复制用户密码', MASTER_AUTO_POSITION=1; -- 启动复制 START SLAVE;
步骤6:验证切换结果
登录新主库B执行写入操作,然后登录新从库A查看数据是否同步成功:
-- 新主库B执行 CREATE DATABASE test_gtid_switch; USE test_gtid_switch; CREATE TABLE t1(id INT PRIMARY KEY); INSERT INTO t1 VALUES(1); -- 新从库A执行 USE test_gtid_switch; SELECT * FROM t1;
如果从库A能查询到插入的数据,说明主从切换成功,新的复制关系正常运行。
注意事项
- 所有参与GTID复制的实例,mysql版本建议保持一致,至少都是5.7及以上,避免版本差异导致GTID兼容问题。
- 复制用户的权限需要包含REPLICATION SLAVE、REPLICATION CLIENT权限,确保可以正常拉取binlog。
- 不要手动修改gtid_purged参数,除非明确知道操作的影响,错误的设置会导致事务同步异常。
- 主从切换完成后,建议检查应用的数据库连接配置,将写请求指向新的主库,读请求根据需求分配到对应的从库。