mysql跨大版本升级必须分阶段:先升至5.7.latest(启用gtid、row格式等),再升至8.0.33+并执行数据字典升级;mgr/主从/xtradb集群需严格验证节点状态与配置,否则导致复制中断、脑裂或启动失败。

不能直接跨大版本滚动升级,必须分阶段、先验证兼容性再逐节点切换。 MySQL 官方不支持 MGR 或主从集群中 5.7 和 8.0 混跑,强行混用会导致 GTID 解析失败、复制中断、节点卡在 RECOVERING 状态——这不是配置问题,是协议层不兼容。
确认集群类型和当前节点角色再动任何配置
不同集群架构升级路径完全不同,错认类型等于直接停服:
- MGR 集群:必须执行
SELECT * FROM performance_schema.replication_group_members;,确认所有节点MEMBER_STATE = ONLINE且VIEW_ID一致;group_replication_group_name必须全局相同,server_id必须唯一 - 主从复制集群:在从库上运行
SHOW SLAVE STATUS\G,重点核对Seconds_Behind_Master = 0、SQL_THREAD_STATE = "Slave has read all relay log";主库上查SHOW MASTER STATUS;记下File和Position - Percona XtraDB Cluster:查
SHOW STATUS LIKE 'wsrep_local_state_comment';,状态不能是Joiner或Donor,否则升级会触发全量 SST
漏掉这步就关进程,大概率触发脑裂或数小时不可用。
5.7 → 8.0 升级必须拆成两步走
官方明确要求主从版本差不得超过一个大版本,且从库版本 ≥ 主库版本。5.7 直升 8.0 不可行,必须经中间态过渡:
- 第一阶段(5.7 → 5.7.latest):所有节点先升到
5.7.40+,确保已启用gtid_mode = ON、binlog_format = ROW、enforce_gtid_consistency = ON,并关闭show_compatibility_56 - 第二阶段(5.7.latest → 8.0.33+):仅允许升到
8.0.33及以上(官方推荐最小跳转版本),启动时必须加--upgrade=MINIMAL或--upgrade=FORCE,不能跳过数据字典升级 - 若配置中残留
sql_mode=NO_AUTO_CREATE_USER或innodb_locks_unsafe_for_binlog,8.0 启动直接报错退出
跳过第一阶段,在 5.7.25 上直接拉起 8.0 二进制,mysqld 会拒绝启动并报 Data Dictionary upgrade required。
滚动升级单个节点的最小安全操作序列
顺序错一步,节点可能永久无法加入集群:
- 先在目标节点执行
STOP GROUP_REPLICATION;(不是SHUTDOWN,更不能kill -9) - 确认
SELECT MEMBER_STATE FROM performance_schema.replication_group_members WHERE MEMBER_HOST = 'xxx';返回OFFLINE - 停掉
mysqld进程,替换mysqld二进制 +share/目录(8.0 升级需同步更新mysql-systemd-start脚本) - 启动前检查配置:8.0 默认开启
STRICT_TRANS_TABLES,若业务 SQL 存在隐式类型转换,需提前在应用侧修复或临时降级sql_mode - 启动后立即执行
START GROUP_REPLICATION;,不要做任何其他操作
升级后节点卡在 RECOVERING?90% 是 donor 的 binlog 已被 purge。升级前务必在所有节点执行 SET GLOBAL binlog_expire_logs_seconds = 604800;(7 天保留)。
升级后必须立刻验证的三个隐性断裂点
即使 SHOW SLAVE STATUS 显示正常,以下三点不检查,上线后必出问题:
-
SELECT USER();返回空或报错:说明系统表未升级,mysql.user还是 5.7 结构,权限校验逻辑崩溃;必须补执行mysqld --upgrade=FORCE --datadir=... - 应用连不上:8.0 默认认证插件变为
caching_sha2_password,老客户端连接串没加allowPublicKeyRetrieval=true&useSSL=false就会Access denied - 唯一索引冲突:字符集默认排序规则从
utf8mb4_unicode_ci变为utf8mb4_0900_ai_ci,原来不重复的值可能被判定为重复,导致Duplicate entry
这些不是“升级完成”的标志,而是故障的倒计时起点。











