Error 1045不是密码错误的简单提示,而是MySQL认证链中断的综合信号:需依次排查root@localhost是否存在、host是否精确匹配、plugin(如caching_sha2_password)是否兼容、authentication_string是否有效,以及权限是否启用,缺一不可。

直接说结论:Error 1045 不是单一故障,而是 MySQL 在认证链上某处断开的信号——可能是密码错、用户不存在、host不匹配、插件不兼容,或权限表根本没加载。不能只重置密码了事,得按线索逐层排查。
查 mysql.user 表确认用户是否存在且 host 匹配
很多问题根源不是密码错,而是 'root'@'localhost' 这条记录压根不存在,或者被误删。连接失败时先别急着重置密码,用安全模式进库查表:
- 停服务后加
--skip-grant-tables启动(Linux:sudo mysqld_safe --skip-grant-tables &;Windows:在my.ini的[mysqld]下加skip-grant-tables) - 无密码登录:
mysql -u root - 执行:
USE mysql;→SELECT host, user, authentication_string FROM user WHERE user = 'root';
如果结果为空,说明 root@localhost 用户丢失,需重建:CREATE USER 'root'@'localhost' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
注意 MySQL 8.0+ 的 caching_sha2_password 插件兼容性
MySQL 8.0 默认改用 caching_sha2_password 认证插件,但老客户端(如旧版 Navicat、某些 JDBC 驱动)不支持,会报 1045 却不提示真实原因。此时即使密码正确也连不上。
- 登录后检查:
SELECT host, user, plugin FROM mysql.user WHERE user = 'root'; - 若
plugin是caching_sha2_password,且你用的是不兼容客户端,临时切回兼容插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 重启服务或执行
FLUSH PRIVILEGES;生效
区分 localhost 和 127.0.0.1 的 host 权限
MySQL 把 localhost 和 127.0.0.1 当作两个完全不同的 host。用 mysql -h 127.0.0.1 -u root -p 连,匹配的是 'root'@'127.0.0.1';而 mysql -u root -p 默认走 socket,匹配 'root'@'localhost'。两者权限可能完全不同。
- 查全量用户:
SELECT host, user FROM mysql.user WHERE user = 'root'; - 常见漏配:只有
'root'@'127.0.0.1',没建'root'@'localhost'—— 这会导致命令行直接mysql -u root失败 - 补授权:
CREATE USER 'root'@'localhost' IDENTIFIED BY 'same_password'; GRANT ALL ON *.* TO 'root'@'localhost'; FLUSH PRIVILEGES;
别忽略 using password: YES/NO 这个关键提示
错误信息末尾的括号内容是诊断钥匙:(using password: YES) 表示客户端传了密码,但校验失败;(using password: NO) 表示客户端根本没传密码,而服务端要求密码。
-
using password: YES→ 优先查密码是否输错、插件是否兼容、authentication_string是否为空 -
using password: NO→ 检查代码或配置里是否漏写了password字段,或用户被设为无密码但连接时未显式禁用密码(如 JDBC URL 缺?allowPublicKeyRetrieval=true&useSSL=false等) - 特别注意:MySQL 5.7+ 中空密码用户默认不允许远程连接,即使
host='%'也不行
真正麻烦的不是重置密码,而是你改完密码后忘了 FLUSH PRIVILEGES;,或者改的是 'root'@'%' 却用 'root'@'localhost' 登录——这种错位在多 host 场景下极隐蔽,必须把 host、user、plugin、authentication_string 四个字段一起看,缺一不可。


















