必须走官方原地升级路径,因MySQL 5.7与8.0在默认字符集、认证插件、系统表结构、JSON/时间类型行为等方面存在不兼容,直接mysqldump导出导入会导致乱码、登录失败、SQL报错等问题。

不能直接卸载重装再导入——MySQL 5.7 和 8.0 的默认字符集、认证插件、系统表结构、JSON/时间类型行为差异会导致导入失败或数据异常,必须走官方推荐的原地升级路径。
为什么 mysqldump 导出再导入在 MySQL 8.0 上大概率失败
你执行 mysqldump --all-databases 后用 mysql 导入,看似干净,但实际会踩多个隐性坑:
- MySQL 5.7 默认字符集是
latin1或utf8(即utf8mb3),而 MySQL 8.0 默认是utf8mb4,且collation_server默认为utf8mb4_0900_ai_ci;导入时若没显式指定,会触发隐式转换,中文乱码或索引失效 - 用户认证插件从
mysql_native_password变为caching_sha2_password,宝塔创建的旧用户导入后无法登录,连root都可能被锁死 - MySQL 8.0 删除了
mysql.plugin表、重构了mysql.user字段(如plugin,authentication_string),直接导入 5.7 的mysql库会报错中断 -
TIMESTAMP默认行为变更(自动补时区)、JSON函数语法不兼容(如JSON_EXTRACT返回值类型)、GROUP BY严格模式开启,导致业务 SQL 报错
宝塔环境下唯一稳妥的升级方式:使用 mysql_upgrade + 原地替换二进制
宝塔 7.9+ 已支持通过「软件商店 → MySQL → 升级」按钮触发原地升级,它背后调用的是官方 mysql_upgrade 工具,而非重装。操作前必须确认:
- 确保当前 MySQL 5.7 版本 ≥ 5.7.26(低于此版本需先升到 5.7.26 再升 8.0)
- 备份不是可选动作,而是强制前置步骤:
mysqldump -u root -p --all-databases --single-transaction --routines --events > full_backup.sql,并额外tar -czf /www/backup/mysql_data_$(date +%F).tar.gz /www/server/data - 停掉所有依赖 MySQL 的服务(PHP、网站、定时任务),并在宝塔「数据库」页手动停止 MySQL
- 升级包必须匹配你的系统架构(x86_64 / aarch64)和 glibc 版本;宝塔下载的 RPM/DEB 包已适配 CentOS/Ubuntu,不要自行替换官方源码编译版
升级后必须立即执行的三件事
升级完成启动 MySQL 8.0 后,别急着开网站——这些配置不调,第二天就出问题:
- 修改
/etc/my.cnf,在[mysqld]下追加两行:default_authentication_plugin=mysql_native_passwordcollation-server=utf8mb4_unicode_ci(避免 PHP 连接报Client does not support authentication protocol) - 重置所有业务用户密码,强制使用旧协议:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 检查慢日志路径是否变更(8.0 默认关掉
slow_query_log_file,需手动打开并指定路径,否则宝塔「慢日志」功能空白)
最常被忽略的是:升级后 information_schema 和 performance_schema 表结构已更新,但部分老 PHP 扩展(如旧版 PDO)会因字段缺失报错;如果网站首页白屏且错误日志里有 Unknown column 'xxx' in 'field list',大概率是这个原因——得换 PHP 版本或更新扩展。











