版本升级指南
MySQL 版本升级指南
MySQL 版本升级是数据库运维中风险最高的操作之一。本章提供从 5.7 到 8.0 再到 8.4 的完整升级指导,包括预检查、关键不兼容项、升级步骤和回滚预案。
**黄金原则:**① 升级前必须备份 ② 先在测试环境验证 ③ 不支持跨主版本升级(不能从 5.7 直接跳到 8.4,必须经过 8.0)④ 回滚方案必须在升级前就准备好
1. 支持的升级路径
MySQL 5.5 → 5.6 → 5.7 → 8.0 → 8.4 (LTS) ↓ 9.0 (Innovation)
⚠️ 不支持:5.7 → 8.4(必须先升到 8.0) ⚠️ 不支持:跨两个主版本(如 5.6 → 8.0 需先升到 5.7)
2. 升级前预检查
2.1 官方检查工具
-- 方法 1:mysqlcheck(随 MySQL 安装)
mysqlcheck -u root -p --all-databases --check-upgrade
-- 方法 2:MySQL Shell(推荐,最全面)
mysqlsh> util.checkForServerUpgrade('root@localhost:3306', {
targetVersion: "8.0",
outputFormat: "JSON",
issues: {level: "Error"}
})
-- 方法 3:mysqld --upgrade=CHECK(8.0+ 内置检查)
mysqld --upgrade=CHECK --datadir=/var/lib/mysql
2.2 手动检查清单
-- 1. 检查 utf8(非 mb4)字段(可能有长度变化)
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME
FROM information_schema.COLUMNS
WHERE CHARACTER_SET_NAME = 'utf8'
AND TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys');
-- 2. 检查 FLOAT/DOUBLE 用于金额字段
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM information_schema.COLUMNS
WHERE DATA_TYPE IN ('float', 'double')
AND TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys');
-- 3. 检查无主键的表(8.0 建议所有 InnoDB 表有主键)
SELECT t.TABLE_SCHEMA, t.TABLE_NAME
FROM information_schema.TABLES t
LEFT JOIN information_schema.TABLE_CONSTRAINTS tc
ON t.TABLE_SCHEMA = tc.TABLE_SCHEMA
AND t.TABLE_NAME = tc.TABLE_NAME
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
WHERE t.TABLE_TYPE = 'BASE TABLE'
AND t.TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
AND tc.TABLE_NAME IS NULL;
-- 4. 检查当前 SQL Mode
SELECT @@sql_mode;
3. MySQL 5.7 → 8.0 关键变更
3.1 SQL Mode 变化
8.0 中 ONLY_FULL_GROUP_BY 默认启用且更严格。5.7 中某些"模糊"的 GROUP BY 查询在 8.0 会报错。
-- 5.7 中可能通过,8.0 会报错:
SELECT user_id, email, COUNT(*) FROM users GROUP BY user_id;
-- email 不在 GROUP BY 中也不在聚合函数里,报错
-- 修复方法:
SELECT user_id, MAX(email), COUNT(*) FROM users GROUP BY user_id;
-- 或:GROUP BY user_id, email
3.2 默认字符集变更
-- 5.7 默认:latin1
-- 8.0 默认:utf8mb4 + utf8mb4_0900_ai_ci
-- 影响:如果 5.7 中用 latin1 存储的数据升级到 8.0,
-- 需要确认排序规则变更不影响业务逻辑(ORDER BY 结果可能不同)
-- 升级前检查所有 latin1 表:
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_COLLATION LIKE 'latin1%'
AND TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys');
3.3 Query Cache 移除
-- 8.0 移除了 Query Cache,相关参数在 8.0 中报错
-- 升级前清理 my.cnf 中的:
# query_cache_type = 1 ← 删除
# query_cache_size = 128M ← 删除
# query_cache_limit = 1M ← 删除
3.4 认证插件变更
-- 5.7 默认:mysql_native_password
-- 8.0 默认:caching_sha2_password
-- 旧 JDBC 驱动(mysql-connector-java 5.x)不支持 caching_sha2_password
-- 需要升级驱动到 8.x,或将用户认证方式改回 native_password(临时方案)
-- 临时方案(不推荐长期):
ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
3.5 其他重要变更
| 变更项 | 5.7 | 8.0 | 处理方法 |
|---|---|---|---|
| innodb_file_format | Antelope/Barracuda | 已移除(默认 Barracuda) | 删除 my.cnf 中该参数 |
| innodb_large_prefix | ON/OFF | 已移除(默认 ON) | 删除 my.cnf 中该参数 |
| ROW_FORMAT=FIXED(MyISAM) | 支持 | InnoDB 已废弃 | 迁移到 InnoDB |
| YEAR(2) | 支持 | 已移除 | 改为 YEAR(4) |
| PROCEDURE ANALYSE() | 支持 | 已移除 | 改用 information_schema 分析 |
4. MySQL 8.0 → 8.4 关键变更
4.1 认证插件禁用
mysql_native_password 在 8.4 中默认禁用(8.0 是默认可用但已废弃)。
-- 升级前,迁移所有使用 native_password 的用户
SELECT user, host, plugin FROM mysql.user WHERE plugin = 'mysql_native_password';
-- 迁移脚本(批量修改)
SELECT CONCAT('ALTER USER ''', user, '''@''', host, ''' IDENTIFIED WITH caching_sha2_password BY ''your_new_password'';')
FROM mysql.user
WHERE plugin = 'mysql_native_password' AND user NOT IN ('root', 'mysql.sys');
4.2 复制命令废弃
-- 更新所有监控脚本、运维工具、应用代码中的复制命令
-- 旧 → 新:
SHOW SLAVE STATUS → SHOW REPLICA STATUS
CHANGE MASTER TO → CHANGE REPLICATION SOURCE TO
START/STOP SLAVE → START/STOP REPLICA
RESET MASTER → RESET BINARY LOGS AND GTIDS
5. 升级步骤(Rolling Upgrade,零停机)
步骤 1
备份 + 测试环境验证
完整备份(xtrabackup 物理备份)。在测试环境复现生产数据,完成所有预检查,运行回归测试。
步骤 2
升级从库(Replica)
先停止从库,原地升级(RPM/DEB 替换二进制),mysqld --upgrade=AUTO 自动更新系统表。
systemctl stop mysqld
yum install -y mysql-server-8.0 # 或 apt-get
systemctl start mysqld
mysql_upgrade -u root -p # 8.0 自动;8.4 由 mysqld 自动完成
步骤 3
验证从库复制正常
SHOW REPLICA STATUS\G
-- Seconds_Behind_Source 应接近 0
-- Last_Error 应为空
步骤 4
主从切换
将升级后的从库提升为主库(通过 MHA/Orchestrator/手动 GTID 切换)。
步骤 5
升级原主库
原主库变为从库后,同步追上新主库,再执行相同升级流程。
步骤 6
验证 + 稳定期
保留原版本备用服务器至少 1-2 周,确认业务无异常后正式完成升级。
6. 回滚预案
**重要:MySQL 升级不支持原地降级!**高版本 mysqld 修改了 ibdata/系统表格式,低版本无法读取。回滚方案必须是恢复备份,而不是"原地降级"。
**回滚预案 1(最安全):**保留旧版本从库,升级前停止向旧库写入,如需回滚直接切流量回旧库。
**回滚预案 2:**使用 xtrabackup 物理备份,回滚时恢复到新服务器(新旧服务器并行运行,按需切换)。
**回滚预案 3(大表):**使用 Canal/Debezium 将新主库数据实时同步回旧版备库,在确认新版稳定前保持双向同步能力。