「MySQL 5.7 → MySQL 8.0」生产级升级指南,按 宝塔 / Linux 常见环境来写,可直接照做,同时我会把 坑点、是否必须升级、回滚方案一次讲清楚。
重要结论先说:MySQL 8.0 不是平滑升级,一定要 完整备份 + 验证兼容性尤其是 老项目(如 CRMEB / 老 Java / PHP 框架)
一、升级前必须确认的 6 件事(非常重要)
是否真的需要升级?
建议升级到 8.0 的情况
- 数据量大(> 500W 行)
- 并发高、慢 SQL 多
- 需要:窗口函数CTE(WITH)更好的 JSON更强索引 / 优化器
暂不建议升级
- 老项目 + 老 SQL(大量 0000-00-00)
- 使用 GROUP BY 非全字段
- 使用旧 JDBC / PDO 版本
确认 MySQL 5.7 版本
SELECT VERSION();
要求:
>= 5.7.9 (你的 5.7.44 ✔)
检查字符集
SHOW VARIABLES LIKE 'character_set_server';
MySQL 8.0 默认 utf8mb4_0900_ai_ci
老系统可能是:
utf8 / utf8_general_ci
建议升级前统一为 utf8mb4
检查 sql_mode(升级最大坑)
SELECT @@sql_mode;
8.0 默认是:
STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,...
常见爆雷 SQL:
SELECT id, name FROM user GROUP BY id;
升级前必须改 SQL 或关闭 ONLY_FULL_GROUP_BY
检查保留关键字(8.0 新增很多)
重点字段名:
rank
system
window
groups
recursive
检查:
SELECT TABLE_NAME,COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('rank','system','window');
完整备份(必须)
mysqldump \
--all-databases \
--single-transaction \
--routines \
--events \
--triggers \
> /backup/mysql57_full.sql
二、升级方案选择(强烈推荐方案 A)
| 方案 | 说明 | 推荐 |
|---|---|---|
| A | 直接升级(原数据目录) | ❌ 不推荐 |
| B | 全量导出 → 安装 8.0 → 导入 | ✅ 推荐 |
| C | 新服务器迁移 | ⭐⭐⭐⭐⭐ |
宝塔 / 生产环境:一定选 B 或 C
三、方案 B:5.7 → 8.0 标准升级步骤(推荐)
Step 1:停止 MySQL 5.7
service mysqld stop
# 或
systemctl stop mysqld
Step 2:卸载 MySQL 5.7(不删数据)
rpm -qa | grep mysql
yum remove mysql-community-server
不要删 /var/lib/mysql
Step 3:安装 MySQL 8.0
CentOS / Rocky
yum install mysql-community-server-8.0*
Ubuntu
apt install mysql-server-8.0
Step 4:修改 MySQL 8.0 配置(关键)
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
# 兼容 5.7(非常关键)
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
default_authentication_plugin=mysql_native_password
不加最后一行,老 PHP / Java 客户端会连不上Step 5:启动 MySQL 8.0
systemctl start mysqld
Step 6:执行升级检查
mysql_upgrade -uroot -p
8.0.16+ 会自动执行,但建议手动跑一次
Step 7:导入数据
mysql -uroot -p < /backup/mysql57_full.sql
四、升级后必做检查清单
查看错误日志
/var/log/mysqld.log
重点看:
- deprecated
- sql_mode
- auth_plugin
检查用户登录方式
SELECT user,host,plugin FROM mysql.user;
如果是:
caching_sha2_password
老客户端需要改:
ALTER USER 'user'@'%'
IDENTIFIED WITH mysql_native_password BY 'password';
检查慢 SQL
SET GLOBAL slow_query_log=ON;
是否可以回滚?(一定要知道)
可以回滚,前提:
- 你保留了:原 MySQL 5.7原数据目录完整 SQL 备份
8.0 启动过的数据目录不能再给 5.7 用
七、宝塔用户特别说明
宝塔面板:
软件商店 → MySQL → 升级版本(不推荐)
推荐做法
- 新装 MySQL 8.0
- 手动导入

