必须先重建系统库而非跳过校验:mysqld --initialize --user=mysql --datadir=/var/lib/mysql可恢复mysql.user表,手动建表在8.0+完全不可行,且需先确认datadir配置正确。

mysqld_safe --skip-grant-tables 启动后仍报 mysql.user 不存在
直接加 --skip-grant-tables 并不能绕过“表不存在”这个底层问题——它跳过的是权限校验逻辑,但 MySQL 启动时仍需加载 mysql.user 表结构来初始化权限系统。如果该表物理缺失(比如数据目录为空或错配),即使跳过校验,服务也会在启动阶段卡在 Fatal error: Can't open and lock privilege tables。
真正起效的启动方式是 mysqld --initialize 或 --init-file
当 mysql.user 表彻底丢失(常见于新编译安装未初始化、datadir 配置错误、或手动清空了 mysql/ 目录),必须重建整个系统库。这不是 SQL 层面的修复,而是初始化级操作:
- 先确保 MySQL 已停止:
sudo systemctl stop mysqld(或killall mysqld) - 确认
datadir指向正确路径(查/etc/my.cnf或mysqld --verbose --help | grep datadir) - 若该目录下
mysql/子目录为空或缺失,执行:sudo mysqld --initialize --user=mysql --datadir=/var/lib/mysql - 注意:该命令会生成新 root 密码,输出在错误日志里(如
/var/log/mysqld.log),不是终端显示
误用 CREATE TABLE mysql.user 手动建表极大概率失败
网上有教程让你手写 CREATE TABLE mysql.user (...),这在 MySQL 5.7 及以前可能凑合,但在 8.0+ 完全不可行——因为:
- MySQL 8.0+ 的权限表结构已大幅变更,字段名、类型、默认值、索引全部不同(例如
authentication_string替代Password,plugin字段必填) - 系统库
mysql使用COMPACT行格式且依赖数据字典,手工建的表无法被 InnoDB 正确注册 - 即使建表成功,
FLUSH PRIVILEGES也不会生效,后续所有用户操作(包括ALTER USER)都会报错
datadir 配置错误是最常被忽略的根因
很多情况下 mysql.user 并非真的丢失,而是 MySQL 在找错地方。典型表现是:
- 你明明把数据文件放在
/opt/data,但my.cnf里写的是datadir=/var/lib/mysql - 启动时日志出现
InnoDB: Unable to lock ./ibdata1或反复提示找不到mysql/目录 -
ls -l /var/lib/mysql/mysql/返回 “No such file or directory”,但你在别处找到了完整的mysql/目录
此时只需修正 my.cnf 中的 datadir 路径并重启,无需任何表重建操作。











