零停机升级MySQL高可用集群在现实中无法做到绝对“零停机”,但可压缩到秒级(通常30秒内),依赖MGR/InnoDB Cluster的自动故障转移、ProxySQL路由切换或滚动容器化升级等机制实现业务无感。

零停机升级 MySQL 高可用集群在现实中无法做到绝对“零停机”,但可压缩到秒级(通常
主从复制 + Router 切换是最可控的路径
这是当前生产环境落地最成熟、风险最低的方式,适用于 MySQL 5.7+ 或 8.0+ 搭配 MySQL Router 8.0.28+。它把“升级动作”拆成两步:先让新版本从库追平数据,再由 MySQL Router 在毫秒级内重路由写流量。
- 必须启用
GTID:避免CHANGE MASTER TO手动指定File/Position带来的误差和延迟判断失效 -
MySQL Router配置中需启用routing_strategy = first-available或next-available,并设置health_check_interval = 1(单位秒)以加快故障感知 - 新版本从库启动后,务必执行
SELECT MASTER_POS_WAIT('mysql-bin.000001', 123456, 30)确认已追平,而非只看Seconds_Behind_Master = 0(该值在 GTID 模式下可能为 NULL 或不准) - 切换前需临时禁用应用端连接池的自动重连(如 HikariCP 的
connection-test-query可能触发脏连接残留),否则部分请求会在 Router 切换瞬间发往旧主并失败
In-Place 升级只适用于小版本,且不适用于高可用集群
所谓 mysql_upgrade 原地升级,仅适合单实例或非高可用场景下的小版本迭代(如 8.0.33 → 8.0.34)。在主从或 MGR 集群中强行对主库执行,会导致:
- 从库因系统表结构不一致而复制中断,报错类似
Table 'mysql.role_edges' doesn't exist - MGR 节点间
group_replication_group_name兼容性校验失败,整个组分裂 - Router 仍会尝试连接旧版主库,但握手协议不匹配,日志出现
ERROR 2013 (HY000): Lost connection to MySQL server during query
所以——集群环境下禁止对任何在线节点做 In-Place 升级。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
MGR 集群升级必须滚动进行,且顺序不可颠倒
MySQL Group Replication 对版本混合有严格限制:8.0.33 节点不能与 8.0.35 节点共存于同一组,但允许 8.0.33 与 8.0.34 短暂共存(仅限小版本)。滚动升级时,必须按“从节点 → 主节点”顺序操作:
- 逐个将从节点下线 → 替换二进制 → 启动并加入组 → 等待
MEMBER_STATE = ONLINE且MEMBER_ROLE = SECONDARY - 确认所有从节点升级完成、组状态稳定后,再对当前
PRIMARY节点执行同等流程 - 过程中若出现
GROUP_REPLICATION_RECOVERY卡住,大概率是新节点未正确配置clone_plugin或防火墙阻断了33061端口(MGR 克隆端口) - 升级完成后必须运行
SELECT * FROM performance_schema.replication_group_members;和SELECT * FROM performance_schema.replication_group_member_stats;双重验证
最容易被忽略的点:binlog 格式与字符集兼容性
即使版本升级成功,如果主库启用了 binlog_format = STATEMENT 或存在 utf8(非 utf8mb4)字段,新版本从库可能在回放时静默失败或丢数据,现象是:
- 从库 SQL 线程停止,但
SHOW SLAVE STATUS\G中Seconds_Behind_Master仍显示 0 - 错误日志里出现
Could not execute Write_rows event on table xxx; Error_code: 1366(字符集转换失败) - 应用读取到旧快照数据,却查不到新插入记录(
STATEMENT在函数/触发器场景下主从不一致)
因此升级前必须确认:binlog_format = ROW、character_set_server = utf8mb4、collation_server = utf8mb4_0900_ai_ci,且所有表的 CHARACTER SET 显式声明为 utf8mb4。这不是升级步骤,而是升级能否成立的前提。

















