MySQL 8.0 配置基于 GTID 的主从复制需要在主库和从库的配置文件中的 mysqld 段同时设置 gtid_mode=ON 和 enforce_gtid_consistency=ON,并通过 CHANGE MASTER TO MASTER_AUTO_POSITION=1 建立连接。适用场景为需要简化故障切换和避免主从位置计算错误的环境,风险边界在于开启后无法再关闭 GTID 模式且要求所有事务必须是可确定性写入。
先说结论:GTID 复制是 MySQL 8.0 的标准高可用底座,配置核心在于参数一致性和自动定位开关。
- 适合:需要自动化故障转移、避免手动计算 binlog 位置的生产集群。
- 先准备:确保主从 server_id 唯一, binlog 已开启,且数据初始状态一致。
- 验收:通过 SHOW SLAVE STATUS 确认 Auto_Position 为 1 且同步线程无报错。
命令速用版
以下配置片段和 SQL 命令可直接用于标准环境,执行前请备份配置文件。
【my.cnf 配置片段】 [mysqld] server_id=1 gtid_mode=ON enforce_gtid_consistency=ON log_bin=binlog binlog_format=ROW
【从库建立连接命令】 CHANGE MASTER TO MASTER_HOST='主库 IP', MASTER_USER='repl', MASTER_PASSWORD='密码', MASTER_AUTO_POSITION=1; START SLAVE;
为什么会这样
GTID 用全局唯一事务 ID 替代了传统的 binlog 文件名和位置点。传统复制依赖文件偏移量,主从切换时容易计算错误导致数据丢失或重复,GTID 确保每个事务在全球集群中只执行一次。开启 enforce_gtid_consistency=ON 会阻止不可确定性写入(如 CREATE TABLE ... SELECT),这是为了保证 GTID 能被准确记录。
分步处理
按顺序执行以下步骤,每步完成后检查状态再继续。
步骤 1:修改配置文件
在主库和从库的 my.cnf 或 my.ini 中添加 gtid_mode=ON 和 enforce_gtid_consistency=ON。注意 server_id 必须在集群内唯一,主库通常设为 1,从库设为 2 或更高。修改后重启 MySQL 服务使参数生效。
步骤 2:创建复制用户
在主库执行创建用户命令,MySQL 8.0 默认认证插件为 caching_sha2_password,需确保从库支持或指定插件。授权 REPLICATION SLAVE 和 REPLICATION CLIENT 权限。
步骤 3:初始化数据
如果是新搭建集群,确保从库数据与主库一致。可使用 mysqldump 导出主库数据并导入从库,导出时加上 `--set-gtid-purged`=OFF 避免 GTID 冲突。
步骤 4:配置主从关系
在从库执行 CHANGE MASTER TO 命令,关键参数是 MASTER_AUTO_POSITION=1,这告诉从库使用 GTID 自动寻找同步位置。执行 START SLAVE 启动同步线程。
怎么验证是否生效
在从库执行 SHOW SLAVE STATUS\G 命令,重点关注以下字段。
检查点 1:Auto_Position
字段值必须为 1,表示已启用 GTID 自动定位。如果为 0,说明仍在使用传统 binlog 位置复制。
检查点 2:线程状态
Slave_IO_Running 和 Slave_SQL_Running 必须均为 Yes。如果有 No,查看 Last_IO_Error 或 Last_SQL_Error 字段排查具体报错。
检查点 3:GTID 执行集
查看 Executed_Gtid_Set 字段,确认是否有持续增加的 GTID 记录,这代表事务正在正常同步。
常见坑
风险 1:RESET MASTER 清除 GTID
不要在从库执行 RESET MASTER,这会清空 executed_gtid_set,导致主从 GTID 集合不一致,后续无法重新同步。公开资料中没有看到可靠的量化数据说明恢复成本,但通常意味着需要重做从库。
风险 2:混合事务支持
开启 GTID 后,不支持在一个事务中同时更新事务表和非事务表,也不支持 CREATE TABLE ... SELECT 语句。业务代码需规避此类写法。
风险 3:只读从库写入
建议在从库开启 read_only=1,防止误写入导致主从数据 diverge。GTID 模式下误写入会导致 GTID 冲突,报错 1840。
常见问题
GTID 模式开启后能关闭吗?
不能直接关闭。一旦开启 gtid_mode=ON,官方文档明确指出不支持安全地关闭该模式,通常需要重建集群。
从库报错 1840 怎么处理?
该错误表示 GTID 已执行。如果是空事务导致,可在从库执行 SET GLOBAL gtid_next='GTID 值' 后执行 BEGIN;COMMIT; 补全 GTID,或跳过该事务。
MySQL 8.0 复制用户认证失败怎么办?
MySQL 8.0 默认使用 caching_sha2_password。如果从库版本较低或配置不同,创建用户时指定 IDENTIFIED WITH mysql_native_password 或在主库修改用户认证插件。
参考来源
MySQL Documentation: MySQL 8.0 Reference Manual / Replication with Global Transaction Identifiers
URL: https://dev.mysql.com/doc/refman/8.0/en/replication-gtids.html