phpMyAdmin 用户管理页报错 #1146 是因 mysql.user 系统表缺失,需用 mysqld --initialize-insecure 重建;MySQL 8.0+ 必须搭配 phpMyAdmin ≥5.0,且用户操作须用 CREATE USER/GRANT,禁用直接 INSERT。
phpMyAdmin 打不开用户管理页,提示 #1146 - Table 'mysql.user' doesn't exist
这是最典型的症状:点进「用户账户」就报错,或者 phpmyadmin 根本不显示用户列表。根本原因不是权限问题,而是 mysql.user 这张系统表真的没了——它被误删、崩溃损坏,或 mysql 升级后未初始化。
别急着重装 MySQL。这张表属于系统数据库,不能用普通方式 CREATE,必须靠 MySQL 自带的初始化机制重建。
- 停掉 MySQL 服务:
sudo systemctl stop mysql(Linux)或任务管理器结束mysqld.exe(Windows) - 用
--initialize-insecure启动 mysqld(仅临时):mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql(路径按实际调整) - 注意:这个命令不会改 root 密码,但会重建所有系统表,包括
mysql.user、mysql.db等 - 启动失败?检查
datadir权限是否为mysql用户所有,且目录下不能有残留的ibdata1或日志文件干扰初始化
修复后 phpMyAdmin 仍看不到用户,或登录报 Access denied for user 'root'@'localhost'
系统表重建了,但 root 账户没密码、权限为空,或认证插件被重置为 caching_sha2_password(MySQL 8.0+ 默认),而旧版 phpMyAdmin 不支持。
- 用
mysqld_safe --skip-grant-tables &启动跳过权限验证(Linux),或 Windows 下加--skip-grant-tables参数启动 - 连上 MySQL:
mysql -u root,然后执行:UPDATE mysql.user SET authentication_string='', plugin='mysql_native_password' WHERE User='root'; FLUSH PRIVILEGES;
- 重启正常 MySQL 服务(去掉
--skip-grant-tables),再试 phpMyAdmin - 如果仍连不上,检查 phpMyAdmin 的
config.inc.php中$cfg['Servers'][$i]['auth_type']是否为cookie或config,避免硬编码错误密码
MySQL 8.0+ 下 mysql.user 表结构变了,phpMyAdmin 显示字段错乱或报错
MySQL 8.0 把 Password 字段换成 authentication_string,还新增了 password_reuse_history 等字段。老版本 phpMyAdmin(如 4.x)会读错字段名,导致用户页空白或 SQL 报错。
- 确认 phpMyAdmin 版本:
SELECT @@version;和 phpMyAdmin 页面底部版本号 - MySQL 8.0 必须配 phpMyAdmin ≥ 5.0,否则无法正确解析用户权限字段
- 升级方法:直接下载新版压缩包,替换
phpmyadmin/目录,**不要**只覆盖部分文件(易留旧 JS/CSS 引用) - 升级后清空浏览器缓存,尤其
phpmyadmin/js/相关资源,否则前端仍按老结构解析响应
修复完用户界面能打开,但新建用户后立即消失或权限不生效
常见于手动 INSERT 到 mysql.user 表,或用了 GRANT 但没 FLUSH PRIVILEGES。MySQL 8.0+ 更严格:权限变更必须走 CREATE USER + GRANT,不能直改表。
立即学习“PHP免费学习笔记(深入)”;
- 永远不要用
INSERT INTO mysql.user—— 字段逻辑复杂,容易漏设plugin、account_locked等,后续登录必失败 - 正确做法:
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'pass'; GRANT SELECT ON *.* TO 'newuser'@'localhost'; FLUSH PRIVILEGES;
-
FLUSH PRIVILEGES在 MySQL 8.0+ 已非必需(CREATE USER自动加载),但某些 phpMyAdmin 操作仍依赖它刷新内存缓存 - 检查
host字段是否写成'%'而非'localhost'—— 本地连接默认走 socket,匹配的是'localhost',不是'127.0.0.1'
事情说清了就结束。最关键的其实是第一步:别把 mysql.user 当普通表去修,它得靠 MySQL 自己初始化;第二是版本对齐,MySQL 8 和 phpMyAdmin 4 是硬冲突,不是调配置能绕过去的。



















