平滑升级必须走主从滚动路径,不能原地升级主库,否则因binlog事件格式、gtid解析逻辑、系统表结构变更导致旧从库sql线程无法解析,引发error 1236等复制断裂或数据分裂。

主从架构滚动升级不是“换完从库再切主”这么简单,必须按角色、状态、协议三重约束推进,否则复制链路会在某个节点无声断裂。
为什么不能直接升级主库再改从库配置
主库一升级,binlog 事件格式、GTID 解析逻辑、系统表结构就变——旧版从库的 SQL_THREAD 根本无法解析 ANONYMOUS_GTID_LOG_EVENT 或 8.0 新增的 checksum 校验字段,常见报错:ERROR 1236 (HY000): Could not parse relay log event entry。更隐蔽的问题是:SQL_THREAD 表面运行,Seconds_Behind_Master 归零,但实际已跳过大量事务,数据已分裂。
- 5.7 主库升级到 8.0 后,
mysql.user表从 MyISAM 变为 InnoDB,字段类型和权限校验逻辑变更,旧从库加载时直接崩溃 - 8.4 默认禁用
MASTER关键字,而从库配置里还写着CHANGE MASTER TO,启动就语法报错 - 主库启用
binlog_transaction_compression=ON,低版本从库根本不认识这个变量,IO_THREAD 启动失败
从库升级时如何保持复制不断开
关键不是“不停复制”,而是让 IO_THREAD 和 SQL_THREAD 分阶段升级:先停 SQL 线程保数据不乱跑,再换二进制重启,最后让新 SQL 引擎安全消化 relay log。
- 执行
STOP SLAVE SQL_THREAD;,保留IO_THREAD继续拉取 binlog,确保主库新写入不丢失 - 停 mysqld 进程,替换为新版本二进制,修改
my.cnf(特别注意default_authentication_plugin、replica_sql_verify_checksum) - 启动后检查
SHOW SLAVE STATUS\G中Retrieved_Gtid_Set是否持续增长;等Seconds_Behind_Master = 0后,再执行START SLAVE SQL_THREAD; - 若
Slave_SQL_Running_State卡在Reading event from the relay log,说明新版本解析旧 binlog 失败,需人工定位Relay_Log_File对应位置查 event 类型
主从切换后原主库降级接入的坑
旧主库不是“装完新版本就能直接连上新主库”,它要重新适配新主库的认证方式、GTID 模式和 binlog 格式,否则连都连不上。
- 新主库(8.4)默认只加载
caching_sha2_password插件,旧主库(原 8.0)用户仍用mysql_native_password,必须提前在新主库执行:ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; -
mysqldump --master-data=2导出的文件含SET @@GLOBAL.GTID_PURGED,8.4 解析失败,得手动替换为SET @@GLOBAL.GTID_PURGED = '...';格式或改用mysqlpump - 原主库重启后执行
CHANGE SOURCE TO前,必须确认source_host是新主库 IP,且source_auto_position = 1(GTID 开启时);否则会因 position 不匹配卡死
升级后最容易被忽略的验证点
很多人看到 Replica_IO_Running: Yes 和 Replica_SQL_Running: Yes 就以为完事了,但 GTID 集合不一致、慢查询日志爆满、权限模型失效这些隐患,上线后才会暴露。
- 比对主从
SELECT @@gtid_executed;输出是否完全一致,不一致说明有事务未同步或被跳过 - 查错误日志里有没有
InnoDB: Upgrade is required或Unknown system variable,这类 warning 往往预示后续 crash - 运行
SELECT USER();,如果返回空或报Access denied for user ''@'localhost',说明mysql.user表升级失败,得用--skip-grant-tables修复 - 用
pt-table-checksum全量校验主从数据一致性,不能只依赖Seconds_Behind_Master = 0
滚动升级真正的难点不在操作步骤,而在每个节点升级后都要重新校准它与上下游的协议兼容边界——GTID 范围、binlog event 类型、系统表结构、认证插件加载状态,缺一不可。











