跨机房MySQL无缝迁移必须基于GTID,因其可自动定位、避免重复执行、保障事务级一致性;需严格按OFF→OFF_PERMISSIVE→ON_PERMISSIVE→ON四步切换gtid_mode,先设enforce_gtid_consistency=WARN探查兼容性,再确保log_slave_updates=1、binlog_format=ROW、slave_net_timeout=60等网络与日志参数适配跨机房环境。

跨机房 MySQL 无缝迁移的核心,是避免业务中断、不丢数据、不依赖人工定位位点——GTID 是唯一能稳定支撑这点的机制。传统基于 MASTER_LOG_FILE 和 MASTER_LOG_POS 的复制,在网络延迟高、主从时钟不同步、binlog 清理策略不一致的跨机房场景下极易失步或报错。
为什么必须先设 ENFORCE_GTID_CONSISTENCY=WARN
这是整个迁移最易被跳过的“预警探针”。直接开 ON 会导致大量合法 SQL 突然报错(比如含 CREATE TEMPORARY TABLE 的存储过程、跨库 UPDATE 非事务表),业务直接中断。
- 该模式下 MySQL 仅在错误日志中记录
GTID consistency violation,不阻断执行 - 必须盯住
/data/mysql/error.log,持续 3–5 天,确认无此类警告才可推进 - 常见触发点:
MyISAM表参与事务、CREATE TABLE ... SELECT、函数如NOW()出现在语句中但未启用binlog_format=ROW
GTID_MODE 切换必须分四步走,不能跳步
MySQL 5.7+ 要求 gtid_mode 必须按严格顺序过渡:OFF → OFF_PERMISSIVE → ON_PERMISSIVE → ON。跳步会触发错误 ERROR 1789 (HY000): Cannot change gtid_mode while @@global.gtid_mode is OFF_PERMISSIVE。
- 先在所有节点执行
SET GLOBAL GTID_MODE=OFF_PERMISSIVE:允许新事务仍用匿名 ID,老事务继续存在 - 再执行
SET GLOBAL GTID_MODE=ON_PERMISSIVE:新事务开始生成 GTID,但旧匿名事务仍可复制 - 必须等
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT'返回0后,才能执行最终的SET GLOBAL GTID_MODE=ON - 这一步卡住,说明还有未同步完的匿名事务(比如某从库延迟严重),强行切会导致从库 SQL_THREAD 报错
Could not execute Write_rows event on table
从库切换复制源时,MASTER_AUTO_POSITION=1 不等于“自动成功”
很多人以为只要执行了 CHANGE MASTER TO MASTER_AUTO_POSITION=1 就万事大吉,其实它只表示“启用 GTID 自动匹配”,真正能否连上、是否跳过冲突事务,取决于三个隐性条件:
-
log_slave_updates=1必须开启:否则从库自己产生的 binlog 没有 GTID,级联复制断裂 -
binlog_format必须为ROW:statement 格式在跨机房高延迟下极易因非确定函数(RAND(),UUID())导致主从数据不一致 - 主从
gtid_purged集合必须兼容:若目标从库 purged 集合缺失主库已产生的一部分 GTID,START SLAVE会直接报错Client requested master to start replication from position > file size,此时需手动补全(SET GLOBAL gtid_purged='xxx')
跨机房场景下最常被忽略的配置项
不是 GTID 相关参数本身,而是网络与日志行为控制。这些不写进 my.cnf 的配置,会在跨机房长 RTT 下放大问题:
-
slave_net_timeout=60:默认 3600 秒,跨机房链路抖动时从库 IO_THREAD 会长时间假死,表现为Seconds_Behind_Master突增但无报错 -
relay_log_recovery=1:必须开启,否则从库异常重启后 relay log 损坏,SQL_THREAD 无法自动重建而卡死 -
master_info_repository=TABLE和relay_log_info_repository=TABLE:避免文件型元信息在跨机房 NFS 或远程挂载盘上出现读写不一致
GTID 迁移真正的难点不在命令本身,而在对“匿名事务清零”和“gtid_purged 对齐”的耐心验证——这两步没有捷径,也容不得跳过。


















