MySQL 8.0.16+ 已移除 mysql_upgrade,必须用 mysqld --upgrade=FORCE 启动以强制重建系统表;失败主因是残留 5.7 MyISAM 系统表或数据字典不匹配,需确保 datadir 权限正确、禁用 innodb_force_recovery 并留足磁盘空间。

别试 mysql_upgrade,它在 8.0.16+ 已彻底消失;真正能救急的是用 mysqld --upgrade=FORCE 让内核自己重走一遍系统表校验和重建流程。
启动失败时第一件事:看错误日志里有没有 mysql.user 相关报错
这类报错不是配置写错了,而是数据字典根本没加载成功。常见线索包括:
-
Table 'mysql.user' doesn't exist或Unknown table 'mysql.global_grants' [MY-010929] Storage engine 'MyISAM' does not support system tablesData Dictionary initialization failed
这些都指向一个事实:你的 /var/lib/mysql/mysql/ 目录里还残留着 5.7 的 MyISAM 系统表,或字段结构严重不匹配。此时任何客户端操作(比如连上去改权限)都无效——服务根本起不来。
必须用 --upgrade=FORCE 启动,但得先清掉干扰项
这个参数不是万能钥匙,但它唯一能触发 MySQL 内核级的元数据修复逻辑。前提是环境干净:
- 确认
mysqld进程已完全退出:ps aux | grep mysqld返回空 - 临时注释掉
my.cnf中的innodb_force_recovery——否则升级流程会被跳过 - 确保
datadir所有者是mysql:mysql:chown -R mysql:mysql /var/lib/mysql - 磁盘至少留 2GB 空闲空间,否则
performance_schema表重建会失败
执行命令(路径务必准确,不能混用旧版二进制):
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
mysqld --user=mysql --datadir=/var/lib/mysql --upgrade=FORCE
成功会有 Upgrading system tables 和 Finished upgrading system tables 日志行。完成后立刻 kill 进程,再用 systemctl start mysqld 正常启动。
如果 --upgrade=FORCE 卡住或报错,说明目录本身已损坏
这不是参数问题,是 /var/lib/mysql/mysql/ 下的系统表文件(如 mysql.ibd、ibdata1)结构断裂或被删过。此时不能再硬试:
- 不要运行
mysqld --initialize-insecure——它会清空所有用户、角色、GTID、复制配置 - 不要从其他实例拷
.frm或.ibd文件过来 —— 8.0 没有.frm,数据字典全在ibdata1和mysql.ibd里 - 正确做法是启一个同版本干净实例导出结构:
mysqld --initialize-insecure --datadir=/tmp/clean,然后只把/tmp/clean/mysql/下的表定义(不含数据)导入原库
最易被忽略的一点:Windows 用户用记事本改过 my.ini?UTF-8 BOM 或中文引号会导致 mysqld --console 直接崩溃退出,且不报具体行号——换 Notepad++ 用 ANSI 编码重存。










