MySQL报错ERROR 1045很可能是mysql.user表中plugin字段值(如auth_socket或caching_sha2_password)与客户端认证能力不匹配所致,而非密码错误;需检查并用ALTER USER修正对应host的plugin为mysql_native_password。

直接说结论:MySQL报错 ERROR 1045 (28000) 很可能不是密码错了,而是 mysql.user 表里 plugin 字段值不匹配当前认证方式——尤其在 MySQL 5.7 升级到 8.0 后,或使用了非默认认证插件时,这比输错密码更隐蔽、更常被忽略。
为什么 plugin 字段会导致 1045?
MySQL 登录时不仅校验用户名+密码,还会检查该用户记录的 plugin 字段是否支持当前连接方式(如 socket、TCP、客户端版本)。如果字段值是 auth_socket 或 caching_sha2_password,但客户端没提供对应认证能力(比如旧版 MySQL Workbench 连 8.0 默认用户),就会直接拒绝,错误仍显示为 1045,且 using password: YES/NO 可能误导你去改密码。
-
auth_socket:Linux 下常见,依赖系统用户身份,不走密码验证 —— 所以即使输对密码也报 1045 -
caching_sha2_password:MySQL 8.0 默认插件,但老客户端(如某些 Navicat 旧版、PHP 7.2 以下 mysqlnd)不支持,会静默失败 -
mysql_native_password:兼容性最广,几乎所有客户端都支持
怎么查 plugin 字段是否异常?
前提是还能用其他有权限的账号(比如另一个 root、或 sudo 直连 socket)登录。执行:
SELECT host, user, plugin, authentication_string FROM mysql.user WHERE user = 'root';
重点看返回结果中 plugin 列的值。如果你用的是命令行 mysql -u root -p 连不上,但确认密码没错,就极可能是这一列的问题。
- 若看到
auth_socket:说明该用户不接受密码登录,只认 Unix socket 用户名(常见于 Ubuntu 自带 MySQL 包) - 若看到
caching_sha2_password且你用的是旧工具或旧驱动,大概率就是它导致的 - 若
authentication_string为空但plugin是mysql_native_password,那才是真没设密码
如何安全修复 plugin 配置?
不要直接 UPDATE mysql.user 表(风险高、易锁表),优先用 ALTER USER 语句:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_actual_password';<br>FLUSH PRIVILEGES;
- 必须指定完整用户标识
'root'@'localhost',不能只写'root',否则可能改错 host 匹配项 - MySQL 8.0 中
PASSWORD()函数已废弃,别再用UPDATE user SET password=PASSWORD(...) - 改完后立刻
FLUSH PRIVILEGES,否则不会生效 - 如果连
ALTER USER都执行不了(比如根本登不进),才退回到skip-grant-tables方式,但那是最后手段
容易被跳过的细节
很多人修完 plugin 就以为搞定了,结果还是连不上 —— 因为忽略了 host 匹配的优先级问题。MySQL 查 mysql.user 表时,会按 host 字段精确度排序,'localhost' 和 '127.0.0.1' 是两个独立用户,'%' 不匹配 localhost(Unix socket 连接强制走 localhost 行)。所以:
- 用命令行
mysql -u root -p默认走 socket,匹配的是'root'@'localhost',不是'root'@'%' - 用
mysql -h 127.0.0.1 -u root -p才走 TCP,匹配'root'@'127.0.0.1'或'root'@'%' - 务必确认你改的是正在使用的那一行 host,而不是顺手改了
'root'@'%'却忘了'root'@'localhost'


















