mysql 1045 错误是认证失败而非连接失败,本质为用户名、主机名、密码不匹配或认证插件不兼容(如 mysql 8.0+ 的 caching_sha2_password),需检查 user@host 是否存在、密码是否正确、插件是否兼容,并确认远程访问相关配置(bind-address、防火墙、docker 端口映射、云安全组)是否就绪。

什么是 MySQL 1045 错误
MySQL 报错 ERROR 1045 (28000): Access denied for user 'xxx'@'xxx' (using password: YES/NO),本质是认证失败,不是网络不通或服务没启——它已经连上 MySQL 服务器了,只是账号密码或权限不匹配。常见于本地开发、Docker 部署、云数据库初始化后首次连接等场景。
检查用户名、主机名和密码是否匹配
MySQL 的用户是 'user'@'host' 二元组,'root'@'localhost' 和 'root'@'127.0.0.1' 是两个完全不同的用户,密码可以不同,权限也可以独立设置。
- 用已知有权限的账号(如系统 root 或 Docker 初始化时指定的 root)登录:
mysql -u root -p - 查当前有哪些用户:
SELECT User, Host FROM mysql.user; - 确认你试图连接的组合是否存在,比如想用
mysql -u app -h 192.168.1.100 -p,就要找'app'@'192.168.1.100'或通配符'app'@'%' - 密码是否正确?注意:MySQL 8.0+ 默认用
caching_sha2_password插件,某些老客户端(如旧版 PHP mysqli、Navicat 旧版本)不支持,会报 1045 —— 此时不是密码错,而是认证方式不兼容
重置密码或修复认证插件(MySQL 8.0+ 常见)
如果确定用户名存在但密码忘了,或遇到 using password: YES 却仍被拒,大概率是插件不兼容或密码过期。
- 临时跳过权限验证启动(仅限本地排障):
mysqld --skip-grant-tables &,然后连上去执行FLUSH PRIVILEGES;再改密码 - 对 MySQL 8.0+ 用户,强制改用兼容性更好的插件:
ALTER USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 若用户不存在,别直接 INSERT 到
mysql.user表——要用CREATE USER+GRANT,否则权限表可能不一致 - 执行完
GRANT后务必运行FLUSH PRIVILEGES;,否则改动不生效(尤其在非 root 用户下修改他人权限时)
远程连接被拒的典型配置遗漏
即使账号密码全对,'user'@'%' 已创建,也常因以下原因连不上:
- MySQL 配置文件中
bind-address = 127.0.0.1(默认值),导致只监听本地回环,需改为0.0.0.0或注释掉该行 - Linux 防火墙(
ufw或firewalld)拦截了 3306 端口:sudo ufw allow 3306 - Docker 运行时没暴露端口:
-p 3306:3306缺失,或映射到错误宿主机端口 - 云服务商(如阿里云、腾讯云)安全组规则未放行 3306 入方向流量
这些环节任何一个断掉,都会让客户端卡在“连接超时”,但一旦能建立 TCP 连接(比如 telnet 通了),再报 1045 就一定是权限层问题——这点必须分清。










