mysql拒绝连接的主因是'user'@'host'组合不存在或plugin不兼容,而非密码错误;需先根据using password: yes/no判断密码是否提交,再查mysql.user表确认用户记录、host精确匹配、authentication_string非空及plugin兼容性。

这不是密码错了,而是 MySQL 根本没走到校验密码那步——它明确拒绝了 'user'@'host' 这个组合的连接请求。
看报错末尾的 using password: YES 还是 using password: NO
这是最关键的判断起点:
-
using password: NO:MySQL 没收到密码,常见于连接字符串漏-p、Navicat 里没填密码字段、或客户端配置禁用了密码提交 -
using password: YES:密码传过去了,但被拒绝——90% 是mysql.user表里压根没有匹配的'user'@'host'记录,或plugin字段不兼容
查 mysql.user 表确认 'user'@'host' 是否真实存在
登录 MySQL(用有权限账号,如 root)后执行:
SELECT User, Host, plugin, authentication_string FROM mysql.user WHERE User = 'xxx';
重点比对三件事:
- 错误信息里的
'xxx'@'yyy'是否在结果中完全一致——'localhost'和'127.0.0.1'是两个不同 host,不能互换 - 云数据库(如阿里云 RDS)通常禁用
localhost,只认'%'或具体 IP;Docker 容器内连宿主机 MySQL,host 往往是容器网关 IP,不是localhost -
authentication_string字段是否为空或为NULL(尤其using password: NO时),说明密码未设置或被清空
检查 plugin 字段是否为 auth_socket 或 caching_sha2_password
Ubuntu/Debian 默认把 'root'@'localhost' 设为 auth_socket,它不验证密码,只认系统用户身份;MySQL 8.0+ 默认用 caching_sha2_password,老版客户端(如 Navicat 旧版、PyMySQL
- 先用
sudo mysql -u root(不加-p)试试能否进——能进基本锁定是auth_socket问题 - 改认证插件必须用
ALTER USER,不能UPDATE mysql.user:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; - 远程用户常用
'app'@'%',改插件命令为:ALTER USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 改完立即生效,不用
FLUSH PRIVILEGES(但新建用户或直接改表后仍需)
确认监听地址、防火墙和安全组是否放行 TCP 连接
哪怕用户、密码、权限全对,只要这三项之一卡住,最终仍报 Access denied(不是 Connection refused):
- 运行
ss -tlnp | grep :3306,输出中必须含*:3306或外网 IP,不能只有127.0.0.1:3306(说明bind_address = 127.0.0.1未改) - Linux 防火墙要放行 3306:
sudo ufw allow 3306或检查iptables规则 - 云服务器(阿里云/腾讯云)必须在控制台配安全组——只开本地防火墙没用
- 连接池场景下,密码轮换后应用未重启,会持续复用带过期凭证的“僵尸连接”,此时
mysql -u app -p -h xxx手动连成功,但应用仍报错
真正容易被忽略的是 Host 字符串的字面精确匹配——MySQL 不做通配展开,也不自动归一化 IP 或域名。别靠猜,查表、试连、看日志(/var/log/mysql/error.log 里常有更细提示,比如 “no matching entry in user table”)。











