如何在不停机情况下升级mysql_在线升级方案

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

MySQL 在线升级(不停机升级)是生产环境常见需求,核心思路是利用主从架构或高可用方案实现平滑过渡,避免服务中断。直接就地升级(如 yum upgrade 或二进制替换)风险极高,不推荐用于关键业务。

主从切换式升级(最常用、最稳妥)

适用于已部署主从复制的环境。通过将从库升级后再提升为新主库,原主库降级为从库并升级,最终完成双节点升级。

确保主从复制延迟接近 0,且 binlog_format = ROW、gtid_mode = ON(推荐),便于故障回切和一致性校验 先停止从库的 SQL 线程(STOP SLAVE SQL_THREAD),再关闭 mysqld 进程,用新版本 MySQL 二进制文件替换并更新 my.cnf(注意兼容参数,如 remove废弃选项 innodb_locks_unsafe_for_binlog) 启动新版本从库,执行 START SLAVE;确认 Seconds_Behind_Master = 0 且 SHOW SLAVE STATUS 中无错误 执行主从切换:应用层切流至新主库(需配合 VIP/Proxy 或 DNS 切换),原主库停写后降级为从库,再按同样流程升级 升级完成后运行 mysql_upgrade(仅 8.0.16+ 可省略,但建议仍执行以检查系统表兼容性)

使用 MySQL Router + 多副本滚动升级(适合 InnoDB Cluster / Group Replication)

基于 MGR 的集群可借助 MySQL Router 实现自动故障转移与读写分离,支持滚动升级单个节点。

逐个将集群中节点设置为 super_read_only=ON 并 STOP GROUP_REPLICATION,安全退出集群 停掉 mysqld,替换为新版二进制,调整配置(如 group_replication_group_name 必须保持一致,server_id 需唯一) 启动新版本实例,执行 START GROUP_REPLICATION;等待其同步完成并进入 ONLINE 状态 重复上述步骤升级其余节点;Router 会自动剔除不可用节点,流量始终落在健康节点上 升级全程无需人工干预主从关系,强一致性保障更好

Proxy 层灰度引流 + 双写验证(适合无法停写、对一致性要求极高的场景)

在应用与数据库之间引入 Proxy(如 MyCat、ShardingSphere-Proxy、Vitess),通过路由规则控制流量分发,实现“老库读写 + 新库只读 → 新库读写 + 老库只读 → 全量切新库”三阶段过渡。

提前部署同构新版本 MySQL 集群,并开启基于 GTID 的主从复制,与旧主库保持实时同步(可借助外部工具如 MaxScale 或自研 binlog 解析同步) Proxy 配置灰度规则:按用户 ID、订单号哈希或百分比分流,将部分请求写入新库,同时保留旧库全量写入(双写需注意幂等与冲突处理) 通过数据比对工具(如 pt-table-checksum + pt-table-sync)定期校验双库一致性;监控 QPS、慢查、连接数等指标是否异常 确认稳定运行 1–2 天后,逐步扩大新库流量占比,最终关闭旧库写入,完成切换

注意事项与避坑点

在线升级不是“一键操作”,细节决定成败:

版本跨度不宜过大:官方仅保证相邻大版本间兼容(如 5.7 → 8.0 可行,5.6 → 8.0 不支持),小版本建议逐级升级(5.7.30 → 5.7.40) 必须提前测试:在预发环境完整走一遍升级流程,包括备份恢复、权限迁移、字符集兼容性(尤其 utf8mb4)、SQL 模式变更(STRICT_TRANS_TABLES 默认启用影响插入行为) 禁用可能导致中断的操作:升级期间禁止 DDL(尤其是大表 ALTER),避免触发元数据锁阻塞;关闭 event_scheduler 防止定时任务干扰 保留回滚能力:升级前确保有可用的物理备份(xtrabackup)和 binlog 归档,记录旧版本 checksum,以便快速回退

相关推荐