必须走“停机检查 + 数据迁移”路径,因mysql官方不支持8.0到8.4就地二进制升级,8.4采用全新事务性数据字典,直接启动8.0数据目录会报错my-013178并失败。

mysqld --upgrade 会失败),且8.4引入了新的数据字典格式与权限模型变更,强行覆盖启动极大概率导致实例无法启动或元数据损坏。
为什么mysqld --upgrade在8.0→8.4时必然失败
MySQL 8.4的mysqld进程启动时会校验系统表空间(mysql.ibd)和数据字典版本号。8.0的数据字典仍基于mysql库中的MyISAM/InnoDB混合表结构,而8.4已完全切换为原子化、事务性数据字典(mysql.ibd + mysql.ibd内嵌字典元数据)。当你用8.4的二进制文件直接启动8.0的数据目录时,mysqld会在初始化阶段报错退出,典型日志如下:
2026-10-01T09:05:22.112987Z 0 [ERROR] [MY-013178] [Server] Failed to initialize DD Storage Engine
这不是配置问题,是架构级不兼容。官方文档(Upgrading MySQL章节)已将“8.0 → 8.4”归类为「跨LTS大版本迁移」,强制要求逻辑导出/导入或物理复制后重建字典。
mysqldump导出时必须加的三个关键参数
如果你选逻辑迁移(最通用、最安全),mysqldump命令漏掉以下任一参数,恢复到8.4后大概率出现存储过程失效、事件丢失、权限混乱等问题:
-
--routines:否则所有PROCEDURE/FUNCTION不会被导出 -
--events:否则EVENT对象全丢,定时任务静默失效 -
--set-gtid-purged=OFF:8.4默认启用GTID,但8.0实例若未开启GTID,导出时若自动注入SET @@GLOBAL.GTID_PURGED会导致8.4恢复时报错GTID_PURGED can only be set when GTID_MODE = ON
正确命令示例:
mysqldump -u root -p --all-databases --routines --events --set-gtid-purged=OFF --single-transaction > mysql_80_full.sql
物理迁移方案中xtrabackup版本必须严格匹配
物理方式(适合TB级库)看似快,但xtrabackup对MySQL主版本极其敏感。用percona-xtrabackup-80备份8.0,却用percona-xtrabackup-84恢复到8.4,会出现ibdata1校验失败或页格式不识别。实测可靠组合只有:
- 备份端:
percona-xtrabackup-80(如 8.0.35) → 备份8.0实例 - 恢复端:
percona-xtrabackup-84(如 8.4.11) → 准备(--prepare)并还原到8.4新实例
注意:xtrabackup本身不负责版本升级,它只做数据文件搬运。你仍需在8.4实例首次启动时执行mysqld --initialize-insecure初始化新字典,再用xtrabackup把8.0备份恢复进去,最后手动触发mysql_upgrade等效操作(实际是运行mysql --execute="ALTER INSTANCE UPGRADE DATA DIRECTORY NAME")。
升级后必须验证的两个隐藏权限点
8.4收紧了CREATE TABLE和SELECT的默认权限粒度,即使你从8.0完整导出mysql.user表,恢复后也会发现:
- 普通用户无法创建临时表:8.4新增
CREATE TEMPORARY TABLES权限独立控制,不再隐含在CREATE中 -
INFORMATION_SCHEMA查询受限:8.4默认关闭show_compatibility_56=ON,旧应用若依赖information_schema.PROCESSLIST字段(如ID,),需显式授权<code>PROCESS权限
验证命令:
SELECT User,Host,Select_priv,Create_tmp_table_priv,Process_priv FROM mysql.user WHERE User='app_user';最易被忽略的一点:8.4默认禁用
mysql_native_password插件,所有8.0时代用该认证方式的连接字符串都会在升级后立即断连,错误信息是Plugin mysql_native_password could not be loaded。你必须在8.4初始化后、导入数据前,先执行INSTALL PLUGIN mysql_native_password SONAME 'auth_socket.so'(或改用caching_sha2_password并同步更新应用连接池配置)。











