必须用 --skip-grant-tables 安全模式启动 MySQL 并重建 root 账户,因 phpMyAdmin 仅是前端,无法修复底层 mysql.user 表损坏;操作需服务器 root/管理员权限,且须匹配 MySQL 版本的 plugin 与 authentication_string。
phpMyAdmin 里 root 用户登录失败,mysql.user 表被误删或清空怎么办
直接说结论:不能靠 phpmyadmin 恢复,它只是个前端界面,底层权限数据在 mysql 系统库中。一旦 mysql.user 表损坏或为空,mysql 实例本身已失去认证能力,phpmyadmin 连接都会报错(比如 access denied for user 'root'@'localhost' 或更底层的 can't connect to local mysql server)。必须绕过权限系统,用安全模式重置。
用 --skip-grant-tables 启动 MySQL 并重建 root 账户
这是唯一可行的起点。跳过权限验证后,你才能连上 MySQL 并手动插入用户记录。但注意:此操作要求有服务器 root 权限(Linux/macOS)或管理员权限(Windows),且必须停掉正在运行的 MySQL 服务。
常见错误现象:
– 启动时报 Another MySQL daemon already running
– 执行 FLUSH PRIVILEGES 后新用户仍无法登录
– 插入后忘记指定 plugin 字段,导致新 root 用 mysql_native_password 认证失败(尤其 MySQL 8.0+ 默认是 caching_sha2_password)
实操建议:
- 先执行
sudo systemctl stop mysql(或brew services stop mysql/net stop mysql) - 用命令行启动:
sudo mysqld --skip-grant-tables --skip-networking &(--skip-networking防止远程未授权访问) - 另开终端,执行
mysql -u root(此时无需密码) - 在 MySQL shell 中运行:
UPDATE mysql.user SET plugin='mysql_native_password', authentication_string=PASSWORD('your_new_password') WHERE User='root' AND Host='localhost';<br>FLUSH PRIVILEGES; - 退出后正常重启 MySQL 服务(别忘了关掉那个
--skip-grant-tables进程)
MySQL 8.0+ 的 authentication_string 和 plugin 必须匹配
MySQL 5.7 用 PASSWORD() 函数加密,8.0+ 已移除该函数,且默认认证插件变为 caching_sha2_password。如果只改 authentication_string 却没同步改 plugin,root 登录会卡在“access denied”,错误日志里可能只显示 Plugin caching_sha2_password could not be loaded —— 其实是插件和密码哈希不匹配。
立即学习“PHP免费学习笔记(深入)”;
实操建议:
- 确认版本:
SELECT VERSION(); - 查当前 root 插件:
SELECT User, Host, plugin FROM mysql.user WHERE User='root'; - 若想兼容老客户端(如旧版 phpMyAdmin),设为
mysql_native_password;若用 MySQL 8.0+ 新客户端,可设为caching_sha2_password,但密码必须用ALTER USER设置:ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_new_password';
- 别手写 INSERT 到
mysql.user—— 字段多、顺序敏感、8.0+ 新增了account_locked等字段,极易出错
恢复后 phpMyAdmin 仍报 2002 或 1045 错误的排查点
权限表重建成功 ≠ phpMyAdmin 就能用。常见断点不在 MySQL 侧,而在配置或连接方式上。
实操建议:
- 检查 phpMyAdmin 的
config.inc.php中$cfg['Servers'][$i]['host']是否为localhost(它会走 socket)还是127.0.0.1(走 TCP)—— 两者在 MySQL 权限记录里是不同 Host,'root'@'localhost'不等于'root'@'127.0.0.1' - 确认
$cfg['Servers'][$i]['auth_type']是cookie或config,而非http(后者需要 Web 服务器支持 Basic Auth) - 如果用 Docker,宿主机连容器内 MySQL,别填
localhost—— 容器里localhost指自己,应填宿主机网关或用host.docker.internal - Apache/Nginx 日志里搜
PHP Warning: mysqli::real_connect(): (HY000/1045),确认是 MySQL 拒绝,还是 PHP 连接参数根本没传过去
最常被忽略的是 Host 匹配问题:建了 'root'@'localhost',但 phpMyAdmin 配置连的是 127.0.0.1,或者反过来。这个细节不验证,前面所有操作都白做。











