error 1045 是认证失败而非权限不足,源于连接前的身份识别失败;常见原因包括 authentication_string 为空、账号锁定或密码过期、host 不匹配(如 127.0.0.1 与 localhost 视为不同)、认证插件不兼容(如 caching_sha2_password 与旧客户端冲突),需通过 select user, host, plugin, authentication_string 查询用户配置,并用 user() 和 current_user() 确认实际匹配账号。

ERROR 1045 是认证失败,不是权限不足
看到 ERROR 1045 (28000): Access denied for user,第一反应不该是“授权不够”,而是“根本没认出你是谁”。这个错误发生在连接建立前的认证阶段,和 SELECT command denied(ERROR 1044)有本质区别。
常见诱因包括:
-
authentication_string字段为空(尤其在 MySQL 8.0+ 初始化后未设密码) -
account_locked = 'Y'或password_expired = 'Y' - 客户端用
127.0.0.1连,但只建了'user'@'localhost'——MySQL 把这两者视为完全不同的账号 - 认证插件不兼容:MySQL 8.0 默认用
caching_sha2_password,旧版 PHP、Navicat 或 JDBC 驱动可能不支持
查 user@host 是否真实存在且匹配
执行 SELECT User, Host FROM mysql.user WHERE User = 'your_user';,重点看 Host 列是否覆盖你的连接来源。
注意这些细节:
-
'user'@'%'匹配所有 IP,但**不匹配localhost**(Unix socket 路径优先) -
'user'@'192.168.1.%'不匹配192.168.10.5(% 只通配一级网段) - 若应用从容器或云服务连出,实际源 IP 可能是 NAT 后的地址,不是你本地机器的 IP
- 用
mysql -u u -h 127.0.0.1 -p测试时,必须存在'u'@'127.0.0.1'或'u'@'%',不能只靠'u'@'localhost'
确认密码和认证方式是否生效
不要只改密码,要验证存储格式和插件是否被客户端接受。
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
检查方式:
- 查当前认证方式:
SELECT User, Host, plugin, authentication_string FROM mysql.user WHERE User = 'your_user'; - 若插件是
caching_sha2_password且客户端报错,可临时切回兼容模式:ALTER USER 'your_user'@'host' IDENTIFIED WITH mysql_native_password BY 'password'; - 如果
authentication_string为空,说明密码未设置成功,需显式SET PASSWORD或重跑ALTER USER ... BY - MySQL 8.0+ 密码过期策略默认启用,
password_expired = 'Y'会导致首次连接后立即断开,需ALTER USER ... PASSWORD EXPIRE NEVER;
用 USER() 和 CURRENT_USER() 定位“你以为的用户”和“MySQL 认的用户”
登录成功后立刻执行:SELECT USER(), CURRENT_USER();
这两个值不一致,就说明 MySQL 没选中你预期的那个账号:
-
USER()显示你“声称自己是谁”,含客户端 IP -
CURRENT_USER()显示 MySQL “实际匹配到的账号”,即真正生效权限的来源 - 例如你用
mysql -u app -h 10.0.2.15 -p登录,返回app@10.0.2.15和app@'10.0.2.%',说明权限来自后者;但如果返回app@10.0.2.15和''@'10.0.2.15'(空用户名),那其实是匿名用户劫持了连接,得删掉它:DROP USER ''@'10.0.2.15';
真正卡住人的地方往往不在权限语句写错,而在 host 解析规则、socket/TCP 差异、插件兼容性这些底层匹配逻辑上。每次改完配置,别急着重试应用,先用命令行复现连接路径,把 USER() 和 CURRENT_USER() 打印出来看一眼。










