结论:mysqldump备份不兼容5.6→8.0迁移,仅是假象;真正保障兼容的是原地升级路径,备份仅用于失败回滚。宝塔7.9+的“升级”按钮实际执行停服、替换二进制、自动运行mysql_upgrade修复系统表与认证结构,绕开所有逻辑导出陷阱,且要求先升至≥5.7.26再升8.0。

直接说结论:mysqldump 备份本身不兼容 5.6→8.0 迁移,它只是“看起来能用”的假象;真正保障兼容性的不是备份方式,而是升级路径本身——必须走原地升级,备份只用于兜底。
为什么 mysqldump 备份在 5.6→8.0 场景下必然失准
宝塔面板的「数据库备份」按钮、手动执行的 mysqldump -u root -p --all-databases,底层都是逻辑导出。它无法绕过 MySQL 5.6 与 8.0 之间四层硬性断裂:
-
character_set_server默认值从latin1/utf8(即 utf8mb3)变成utf8mb4,未显式指定--default-character-set=utf8mb4导入时会触发隐式转换,中文字段变问号或截断 - 用户认证插件从
mysql_native_password升级为caching_sha2_password,mysqldump导出的mysql.user表直接导入后,所有用户(含 root)连接失败 -
mysql系统库结构已重构:password字段被移除,authentication_string取而代之;mysql.plugin表彻底删除——导入必然中断 - SQL 模式默认启用
ONLY_FULL_GROUP_BY,旧业务中SELECT a, b FROM t GROUP BY a这类语句在 8.0 下直接报错,而mysqldump不校验也不修复
备份该怎么做才真正有用
备份不是为了“还原到 8.0”,而是为原地升级失败提供回滚能力。因此必须双轨并行:
- 执行
mysqldump -u root -p --all-databases --single-transaction --routines --events --triggers > full_backup.sql,并用sha256sum校验文件完整性 - 同步做物理备份:
tar -czf /www/backup/mysql_data_$(date +%F).tar.gz /www/server/data(保留原始ibdata1、ib_logfile*和每个库目录) - 把这两份备份(逻辑 + 物理)拷贝到离线存储,且确保目标机器磁盘空间 ≥ 原数据目录 2 倍——升级失败回滚时需完整覆盖
宝塔面板里“升级”按钮背后的真实动作
宝塔 7.9+ 的 MySQL 升级功能,本质是调用官方原地升级流程,不是重装。它实际执行的是:
- 停掉
mysqld服务,但不动/www/server/data目录里的任何文件 - 替换
/www/server/mysql/bin/mysqld为 8.0 版本二进制文件 - 自动运行
mysql_upgrade -u root -p:逐个检查并修复mysql库表结构、更新authentication_string、校验utf8mb4兼容性、重建系统视图 - 重启服务后,socket、端口、配置项全都不变,应用几乎无感
这个过程绕开了所有 mysqldump 的逻辑陷阱,也是 MySQL 官方文档唯一推荐的跨大版本升级方式。
最容易被忽略的硬性前提
跳过任意一条,点“升级”等于主动触发故障:
- 当前 MySQL 必须 ≥5.7.26 —— 如果你卡在 5.6.x,先在宝塔里升到 5.7.26,再升 8.0;5.6 直升 8.0 不被官方支持,
mysql_upgrade会拒绝执行 -
innodb_file_per_table必须为 ON(5.6 默认 OFF),否则升级时无法单独校验每张表,mysql_upgrade报错退出 - 所有 MyISAM 表必须提前转成 InnoDB:
ALTER TABLE db.tbl ENGINE=InnoDB,否则 8.0 启动时拒绝加载非 InnoDB 系统表 - 确认没有
INNODB_开头的用户表名,否则升级后与 8.0 新增的INNODB_TRX等系统视图冲突,查询直接报错
这些检查项不写进备份脚本,也不会被 mysqldump 捕获——它们必须在升级前人工验证,一个都不能少。











