什么是 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 3306Docker 运行时没暴露端口:
-p 3306:3306缺失,或映射到错误宿主机端口 云服务商(如阿里云、腾讯云)安全组规则未放行 3306 入方向流量
这些环节任何一个断掉,都会让客户端卡在“连接超时”,但一旦能建立 TCP 连接(比如 telnet 通了),再报 1045 就一定是权限层问题——这点必须分清。
