原地升级失败90%卡在元数据层面,必须停服务后用mysql 8.0的mysqld执行--upgrade=force强制修复数据字典;出现“data dictionary initialization failed”或my-010020即表明5.7残留结构与8.0不兼容,严禁删ibdata1、跳过5.7中转或误设innodb_force_recovery。

原地升级失败,90% 是卡在元数据层面,不是配置写错,而是 MySQL 8.0 的数据字典无法识别 5.7 留下的结构残留——必须停服务、用 8.0 的 mysqld 二进制执行 --upgrade=FORCE,跳过这步直接重启只会反复报错。
启动时出现 “Data Dictionary initialization failed” 或 MY-010020 错误
这是最典型的信号,说明 InnoDB 数据字典格式不兼容。5.7 的 ibdata1、mysql.ibd 和系统表空间页结构与 8.0 内核不匹配,不能靠删文件或改配置绕过。
- 别碰
ibdata1:它是数据字典根节点,删除等于清空权限、统计信息、系统表定义 - 确认是否跳过了 5.7 中转:从 5.6 或更早直升 8.0 必然失败,必须先在 5.7 环境下运行过
mysql_upgrade(仅限 5.7) - 检查 redo 日志是否同步:错误日志若含
Page [] log sequence number is in the future!,说明复制 data 目录时漏了#innodb_redo(Linux)或ib_logfile*(Windows),需补全或删掉让 8.0 重建
报 “Table 'mysql.user' doesn't exist” 或 “Can't find file: './mysql/plugin.frm'”
本质是系统表引擎或结构未迁移。MySQL 8.0 彻底弃用 MyISAM 系统表,且所有系统表字段、索引、外键关系已重构。
- 先查引擎:
SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='mysql' AND TABLE_NAME IN ('plugin','servers');,若返回MyISAM,必须在 5.7 环境下执行ALTER TABLE mysql.plugin ENGINE=InnoDB;(操作前设innodb_fast_shutdown=0并停写) -
--upgrade=FORCE必须由 8.0 的mysqld执行,路径不能错;Docker 用户要确认容器内调用的是镜像自带二进制,不是挂载进来的旧版 - 若卡在
performance_schema或innodb_index_stats,立即停住——说明磁盘空间不足或权限不对,df -h和chown -R mysql:mysql /var/lib/mysql比重试更有效
升级后能启动但权限异常、SHOW GRANTS 显示为空
不是权限丢了,是 mysql.user 表结构没真正升级完成。8.0 的 plugin、authentication_string 字段缺失,或仍残留 Password 字段,说明 --upgrade=FORCE 没成功跑完。
- 执行
DESC mysql.user;,确认是否存在plugin和authentication_string字段;若缺,必须停服务再跑一次mysqld --upgrade=FORCE - 老客户端连不上常因
caching_sha2_password插件不兼容,临时修复用ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';,但注意:这只是改认证方式,不还原密码明文 -
FLUSH PRIVILEGES无效——8.0 权限缓存机制已变,真正生效依赖元数据升级完成,不是刷新权限表
用 mysqlcheck --check-upgrade 看到 “OK” 就以为过关
它只检测显式不兼容项,对隐性冲突完全无感。比如 mysql 库下用户自建的 columns 表会和 8.0 新增的 information_schema.COLUMNS 视图冲突,但 --check-upgrade 不报;又比如 INNODB_SYS_TABLES 有记录但 TABLES 查不到对应行,这种元数据不一致它也跳过。
- 真正前置检查要用
mysqlsh的util.checkForServerUpgrade(),它能识别utf8mb3字符集、保留字如rank、caching_sha2_password兼容性等语义级问题 - 导出时别只用
mysqldump --all-databases:必须加--default-character-set=utf8mb4,否则中文和 emoji 在导入时被截断 - 升级后第一件事不是开业务,而是确认
SELECT VERSION();返回 8.0.x,且SELECT @@collation_server;是utf8mb4_0900_ai_ci—— 这两个值错一个,后续字符集和排序行为就不可控
最易被忽略的点:Windows 下路径混用反斜杠和正斜杠会导致 Failed to find valid data directory,而错误日志里根本不会提示具体哪一行路径错了;还有就是 explicit_defaults_for_timestamp=OFF 这种参数在 8.0 已废弃,配置里留着就会让服务卡在启动阶段,连错误日志都写不全。











