mysql升级中的二进制日志与GTID配置更新

来源:这里教程网 时间:2026-02-28 20:42:12 作者:

升级 MySQL 后
gtid_mode
无法启用:必须先清理
binlog

MySQL 升级(尤其是跨大版本,如 5.7 → 8.0)后直接开启

gtid_mode=ON
会失败,报错类似:
ERROR 3787 (HY000): Cannot turn on GTID_MODE when binary logging is disabled or when gtid_mode = OFF and there are previous GTIDs in the binary log.
根本原因是:旧 binlog 文件里含有非 GTID 格式事件,而 MySQL 8.0 要求开启 GTID 前必须确保所有 binlog 中不含 legacy event,且
previous_gtid_event
为空。最稳妥做法是清空 binlog 并重置 GTID 状态。

执行
RESET MASTER
—— 删除所有 binlog 文件并重置
mysql.gtid_executed
确认
SHOW MASTER STATUS
返回空结果、
SELECT * FROM mysql.gtid_executed
返回空集
再设置
gtid_mode=ON
enforce_gtid_consistency=ON
,否则启动会拒绝
注意:
RESET MASTER
不可逆,主从切换期间需停写或提前切流

enforce_gtid_consistency
的三个级别实际影响

该参数不是布尔开关,而是枚举值:

OFF
WARN
ON
。升级后若只设
gtid_mode=ON
但漏设
enforce_gtid_consistency=ON
,MySQL 允许启动,但后续遇到不兼容语句(如
CREATE TEMPORARY TABLE
INSERT ... SELECT
涉及非事务表)会直接报错中断事务,而不是降级警告。

OFF
:不检查,GTID 可能生成但不保证一致性(危险,禁用)
WARN
:记录 warning 日志但允许执行(仅调试用)
ON
:强制拦截不安全语句,确保所有事务可被 GTID 唯一标识
必须在
gtid_mode=ON
之前或同时设为
ON
,否则 MySQL 会拒绝启动

主从切换时
CHANGE REPLICATION SOURCE TO
的 GTID 参数写法

MySQL 8.0.23+ 已弃用

CHANGE MASTER TO
,新语法必须用
CHANGE REPLICATION SOURCE TO
,且开启 GTID 后不能再指定
MASTER_LOG_FILE
MASTER_LOG_POS
。错误写法会导致复制启动失败或跳过部分事务。

正确写法:
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='10.0.1.2',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='xxx',
  SOURCE_AUTO_POSITION=1;
SOURCE_AUTO_POSITION=1
是关键,它让从库自动向主库请求缺失的 GTID 集合
若手动指定位置(哪怕值正确),MySQL 会忽略 GTID 自动定位逻辑,导致复制断裂 首次配置前,务必确认从库
SELECT @@GLOBAL.GTID_EXECUTED
包含主库已执行的所有 GTID

升级后
mysql.gtid_executed
表数据异常的修复路径

某些升级场景(如 5.7 升 8.0 时未清 binlog)会导致

mysql.gtid_executed
表残留脏数据,表现为
SHOW SLAVE STATUS\G
Retrieved_Gtid_Set
Executed_Gtid_Set
不连续,或复制卡在某 GTID 上不动。

先停复制:
STOP REPLICA
检查当前 GTID 执行状态:
SELECT * FROM mysql.gtid_executed
,对比
SELECT @@GLOBAL.GTID_EXECUTED
若表中存在孤立区间(如只有
aaa-bbb-ccc:1-100
,但全局变量含
:101-200
),需重建:
TRUNCATE TABLE mysql.gtid_executed;
INSERT INTO mysql.gtid_executed SELECT * FROM performance_schema.replication_applier_status_by_worker;
最后
START REPLICA
,观察是否恢复追赶

GTID 不是“开了就稳”的功能,升级后 binlog 清理、参数顺序、复制语句写法、系统表一致性这四点,任一遗漏都会引发隐性故障。尤其

RESET MASTER
SOURCE_AUTO_POSITION=1
这两个动作,容易因文档混淆或习惯性写旧命令而跳过。

相关推荐