MySQL 8.0 如何配置基于 GTID 的主从复制架构?

文章导读
MySQL 8.0 配置基于 GTID 的主从复制需要在主库和从库的配置文件中的 mysqld 段同时设置 gtid_mode=ON 和 enforce_gtid_consistency=ON,并通过 CHANGE MASTER TO MASTER_AUTO_POSITION=1 建立连接。适用场景为需要简化故障切换和避免主从位置计算错误的环境,风险边界在于开启后无法再关闭 GTID 模式且要求所
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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 服务使参数生效。

MySQL 8.0 如何配置基于 GTID 的主从复制架构?

步骤 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 位置复制。

MySQL 8.0 如何配置基于 GTID 的主从复制架构?

检查点 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 语句。业务代码需规避此类写法。

MySQL 8.0 如何配置基于 GTID 的主从复制架构?

风险 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