深色模式
数据库版本升级
摘要:数据库升级的风险在于「不可逆」——大版本降级基本靠还原备份。本文给出升级前检查、就地升级与主从滚动升级两种路径,以及每一步的验证与回滚手段。
适用环境
bash
mysql -uroot -p -e "SELECT @@version;" # 当前版本
mysql -uroot -p -e "SELECT @@sql_mode, @@character_set_server, @@lower_case_table_names;"
# 确认目标版本的升级路径(MySQL 不支持跨大版本直接升,如 5.6 → 8.0 需先到 5.7)1
2
3
2
3
操作步骤
1. 升级前必做检查
bash
# MySQL Shell 的升级检查器(8.0 推荐)
mysqlsh root@localhost -- util checkForServerUpgrade
# 逻辑一致性检查
mysqlcheck -uroot -p --all-databases --check-upgrade1
2
3
4
5
2
3
4
5
- 确认有可用全量备份,并验证过可恢复。
- 确认应用驱动兼容目标版本(如 JDBC 驱动版本)。
- 阅读官方 release notes 中的不兼容变更与废弃特性。
危险
大版本升级(如 5.7 → 8.0)不能通过替换二进制降级回去。唯一可靠的回滚方式是还原升级前的备份,因此备份必须先演练过。
2. 路径 A:就地升级(停机窗口)
bash
sudo systemctl stop mysqld
sudo cp -a /data/mysql/data /data/mysql/data_before_upgrade # 物理备份现场
sudo yum update -y mysql-community-server # 安装新版本
sudo systemctl start mysqld
sudo tail -n 100 /data/mysql/log/mysqld.err # 看升级日志
mysql_upgrade # MySQL 8.0.16 之前需要手工执行;之后由 server 自动完成1
2
3
4
5
6
2
3
4
5
6
3. 路径 B:主从滚动升级(推荐,业务无感知)
bash
# 1) 先升级从库:停从库 → 换版本 → 启动 → 观察复制
sudo systemctl stop mysqld@slave
sudo yum update -y mysql-community-server
sudo systemctl start mysqld@slave
mysql -uroot -p -e "SHOW REPLICA STATUS\G" | grep -E 'Running|Behind'
# 2) 复制稳定后做一次主从切换,把流量切到已升级节点
# 3) 再升级旧主,最后重新建立复制1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
滚动升级要保证从库版本不低于主库版本(低版本从库读高版本主库 binlog 会出错)。
4. 升级后的验证
sql
SELECT @@version;
SHOW GLOBAL STATUS LIKE 'Uptime';
SELECT COUNT(*) FROM shopdb.orders; -- 抽查业务表1
2
3
2
3
bash
# 检查错误日志有无 Unknown/removed variable 之类的报错
grep -iE 'error|unknown|deprecated' /data/mysql/log/mysqld.err | tail -n 301
2
2
5. 灰度与回滚
| 阶段 | 动作 | 回滚方式 |
|---|---|---|
| 灰度 1 台从库 | 升级 + 只读流量 | 重建该从库 |
| 切换主库 | 提升已升级节点 | 切回旧主(版本兼容前提下) |
| 全量铺开 | 升级剩余节点 | 还原备份 |
验证
- [ ] 新版本号正确,错误日志无异常
- [ ] 核心业务接口压测通过,慢查询无新增
- [ ] 主从复制正常,延迟归零
- [ ] 备份任务在新版本下执行成功
常见坑
WARNING
配置项在新版本被移除或改名(如 query_cache_size 在 8.0 被删除)会导致启动失败;升级前先比对配置文件。
WARNING
sql_mode 变化(8.0 默认开启 ONLY_FULL_GROUP_BY)会让原本能跑的 SQL 报错,需在测试环境全量回归。
DANGER
升级窗口内不要同时做其它变更(如改表结构、调参数),否则出问题无法定位是升级还是变更导致。