不能靠mysqldump --all-databases导出再导入实现平滑升级,必须用util.checkforserverupgrade()前置扫描+原地升级+手动清理三类残留;需用目标版本mysqlsh连接5.7实例扫描,修复error/warning项,仅导出业务库,清理废弃参数、myisam表及系统库冲突,并确保5.7≥5.7.26。

不能靠 mysqldump --all-databases 导出再导入实现平滑升级,90% 会失败——不是数据丢了,而是 utf8mb3 字符集、rank 这类保留字、password 字段名等语义级问题导致启动崩溃或权限丢失。真正能落地的路径只有一条:用 util.checkForServerUpgrade() 做前置扫描 + 原地升级(in-place)+ 手动清理三类残留。
必须先跑 util.checkForServerUpgrade(),否则一切操作都白忙
这是 Oracle 官方唯一推荐的跨大版本检查入口,mysqlcheck --check-upgrade 和 mysqldump 都看不见语义级冲突。它运行在 MySQL Shell 8.0+ 中,必须用目标版本对应的 mysqlsh(比如升到 8.0.42,就得用 mysql-shell-8.0.42)连接正在运行的 5.7 实例。
- 优先走 socket 连接:
./mysqlsh -uroot -p -S /tmp/mysql.sock -e "util.checkForServerUpgrade({targetVersion: '8.0.42'})" - 报告里
overallStatus必须是"OK";出现ERROR(如Usage of utf8mb3 charset)必须修复,WARNING(如caching_sha2_password plugin not supported by client)也得处理,否则应用连不上 - 别信“扫描完成就没事了”——要逐条看
description,比如提示Column name 'rank' is a reserved keyword,就得重命名字段或加反引号
导出时死守 --databases,绝不能碰 mysql 系统库
mysqldump --all-databases 是高危操作,它会把 5.7 的 mysql 库一并导出,而 8.0 的 user 表字段已从 password 改成 authentication_string,引擎强制为 InnoDB,权限模型彻底重构。一旦导入,轻则 mysqld 启动崩溃,重则连 root 都登不进去。
- 只导出明确的业务库:
mysqldump --default-character-set=utf8mb4 -u root -p --databases myapp_db shop_db > business.sql - 如果误用了
--all-databases,必须手动删掉所有以CREATE DATABASE mysql或USE mysql开头的段落,再删光所有INSERT INTO mysql.行 - 导入前确认目标 8.0 实例的
mysql库是全新初始化的,不是从 5.7 恢复来的
启动 8.0 前必须清理 my.cnf 和系统表残留
替换二进制后 mysqld 卡在 “Starting MySQL” 或秒退,大概率是配置或数据字典不兼容,不是服务没起来,是校验阶段就被拒载了。
- 删除或注释掉 5.7 已废弃参数:
query_cache_type、innodb_file_format、explicit_defaults_for_timestamp - 显式设置认证插件:
default_authentication_plugin=mysql_native_password(除非你已统一升级 JDBC/PyMySQL 驱动) - 查 MyISAM 表:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'MyISAM',结果非空就得先ALTER TABLE ... ENGINE=InnoDB - 查系统库冲突:
SELECT table_name FROM information_schema.tables WHERE table_schema='mysql' AND table_name IN ('roles','role_edges','components'),这些是 8.0 新增系统表,自定义同名表必须重命名或删掉
原地升级比逻辑导入更可靠,但前提是你没跳过检查
宝塔面板的「升级」按钮、官方 mysql_upgrade 工具、或手动替换二进制后执行 mysqld --upgrade=FORCE,本质都是原地升级——复用原有数据目录,由新版本自动重建系统表和字典。这条路可行,但前提是 util.checkForServerUpgrade() 报告为 OK,且你已手动处理完所有 ERROR/WARNING。
- 当前 5.7 版本必须 ≥5.7.26,低于此版本先升到 5.7.26 再升 8.0
- 必须停掉所有依赖 MySQL 的服务:PHP、网站、计划任务、Redis(若启用了 MySQL 监控)
- 升级包需匹配系统架构(x86_64/aarch64)和 glibc 版本;宝塔提供的 RPM/DEB 包已适配 CentOS/Ubuntu,不要手动替换成官网源码编译版
最容易被忽略的是:升级后必须立刻改三处配置——default_authentication_plugin、collation-server、以及 sql_mode 是否被重置;这些不调,第二天就可能集体报错,而不是当时就崩。











