mysql 5.6 不能直升 8.0,必须先升级至 5.7.26+(如 5.7.40),再升 8.0;需完整备份全库、用户权限及 my.cnf 配置,重装 8.0 后须强制设 default_authentication_plugin=mysql_native_password 并调整字符集与重启。

MySQL 5.6 不能直升 8.0,必须先升到 5.7.26+
宝塔面板不支持 MySQL 5.6 直接升级到 8.0,官方明确要求中间必须经过 5.7 版本——且 5.7.26 是最低门槛。低于这个版本(比如常见的 5.6.41 或 5.7.22),mysql_upgrade 工具会拒绝执行,报错 Upgrade is not supported for this version。
实操建议:
- 先确认当前版本:
mysql --version或登录后执行SELECT VERSION(); - 若为 5.6.x,必须先用宝塔软件商店或手动方式升级到
MySQL 5.7.26或更高(推荐5.7.40) - 升级 5.7 后,务必运行
mysql_upgrade -u root -p并重启服务,否则后续升 8.0 会卡在系统表校验阶段 - 检查
/www/server/data/mysql/下是否存在ibdata1和mysql/目录——这是真实数据目录,不是宝塔界面上显示的路径
备份必须包含三项:全库 SQL + 用户权限 + my.cnf 配置
只导出 mysqldump --all-databases 不够。MySQL 8.0 会拒绝导入旧版 mysql 库(含用户、权限、插件定义),且默认字符集、SQL 模式变更会导致业务 SQL 报错。
实操建议:
- 导出全库(含存储过程、事件、触发器):
mysqldump -u root -p --all-databases --single-transaction --routines --events --triggers > full_backup.sql - 单独导出用户权限语句:
SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user != 'mysql.sys';,再对每条结果执行并保存输出 - 备份配置文件:
cp /www/server/mysql/etc/my.cnf /www/backup/my.cnf.pre80,重点保留character-set-server、sql_mode、innodb_log_file_size等项 - 额外打包数据目录:
tar -czf /www/backup/mysql_data_$(date +%F).tar.gz /www/server/data
重装 MySQL 8.0 后必须立刻改这三行配置
宝塔安装的 MySQL 8.0 默认启用 caching_sha2_password 插件,而 PHP 7.2–7.3、WordPress 5.8 以下、Discuz! X3.4 等大量旧程序不识别该插件,直接导致 Access denied for user 或 Client does not support authentication protocol 错误。
实操建议:
- 编辑
/www/server/mysql/etc/my.cnf,在[mysqld]区块下追加:
[mysqld] default_authentication_plugin=mysql_native_password character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
ib_logfile* 文件(位于 /www/server/data/),否则启动时会报 InnoDB: Error: log file ib_logfile0 is of different size
grep socket /www/server/mysql/etc/my.cnf,确保与 PHP 的 mysql.default_socket 一致(通常是 /tmp/mysql.sock)导入数据后权限重建和字符集转换不能跳过
直接 mysql -u root -p 会失败——因为 8.0 的 <code>mysql 库结构已重构,plugin 字段类型、authentication_string 长度、mysql.user 表字段顺序全变了。你导入的只是业务库,权限得重做。
实操建议:
- 先只导入业务数据库(排除
mysql、sys、information_schema):sed -n '/^-- Current Database: `mysql\|^-- Current Database: `sys\|^-- Current Database: `information_schema/!p' full_backup.sql | mysql -u root -p - 用之前保存的
SHOW GRANTS结果,逐条执行GRANT ... ON ... TO ...重建用户权限 - 对每个业务库执行字符集转换:
ALTER DATABASE `dbname` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;,再对每张表执行ALTER TABLE `tbname` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 检查
SELECT @@sql_mode;,若含ONLY_FULL_GROUP_BY,需在应用层适配或临时关闭(不推荐长期禁用)
真实环境里最容易被忽略的是 innodb_log_file_size 和 lower_case_table_names 的兼容性。前者不清理旧日志文件会导致 mysqld 启动失败;后者若从 0 改为 1(或反之),所有表名大小写敏感性会翻转,连 SELECT * FROM User 都可能查不到数据——这不是报错,是静默失效。











