该错误几乎总是由密码不匹配、plugin认证插件不兼容或mysql.user表中缺失'root'@'localhost'记录三类问题导致;95%情况可通过SELECT确认用户存在性、ALTER USER切换为mysql_native_password插件、CREATE USER补全账号并FLUSH PRIVILEGES修复。

直接说结论:这个错误几乎总是由三类问题导致——密码不匹配、plugin认证插件不兼容,或mysql.user表里压根没有'root'@'localhost'这一行。别急着重装,95% 的情况靠几条 SQL 就能修好。
检查 root 用户是否存在且 host 匹配
很多用户以为“有 root 就能登”,但 MySQL 的用户是 'user'@'host' 二元组。如果表里只有 'root'@'%' 或 'root'@'127.0.0.1',mysql -u root -h localhost 仍会失败。
用一个已知可用的账号(比如其他管理员)登录后执行:
SELECT User, Host FROM mysql.user WHERE User = 'root';
如果结果里没有 localhost 这一行,就得补上:
- 若完全没
'root'@'localhost':运行CREATE USER 'root'@'localhost' IDENTIFIED BY '你的密码'; - 若存在但
Host是%或127.0.0.1:先DROP USER 'root'@'%';(可选),再建'root'@'localhost' - 最后必须执行
FLUSH PRIVILEGES;,否则变更不生效
MySQL 8.0+ 必须确认 authentication plugin
MySQL 8.0 默认用 caching_sha2_password,但老版本客户端、某些 GUI 工具(如旧版 Navicat、HeidiSQL)甚至部分命令行 mysql 客户端不支持它,就会静默拒绝——报错还是 Access denied,但真实原因是插件握手失败。
查当前设置:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';
如果 plugin 列显示 caching_sha2_password,且你确认密码没错,就换回兼容性更好的插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';- 注意:不是
SET plugin = ...,那是过时写法;MySQL 8.0+ 必须用IDENTIFIED WITH - 改完同样要
FLUSH PRIVILEGES;
跳过权限验证重置密码(仅当彻底失联时用)
这不是首选方案,但当你连任何账号都登不进去时,只能临时绕过权限系统。关键点在于:必须停掉原服务、干净启动、且不能有其他 mysqld 进程残留。
- Linux:先
sudo systemctl stop mysql,再sudo mysqld_safe --skip-grant-tables --skip-networking &(加--skip-networking防止远程未授权访问) - Mac:如果用 Homebrew 安装,路径可能是
/usr/local/bin/mysqld_safe,需 sudo 执行 - Windows:编辑
my.ini,在[mysqld]下加一行skip-grant-tables,然后重启服务 - 启动成功后,直接
mysql -u root(不加-p),进库后立刻执行:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - 退出,删掉
skip-grant-tables配置或杀掉进程,再正常启服务
最容易被忽略的一点:MySQL 会优先匹配 Host 字段最具体的记录。比如同时存在 'root'@'localhost' 和 'root'@'%',从本地用 -h localhost 连就一定走前者;但用 -h 127.0.0.1 就可能走后者——而这两者的 plugin 和密码可能完全不同。排查时务必明确你实际连接用的是哪个 host 参数。


















