Access denied 错误主因是用户主机组合不匹配或认证插件不兼容;需严格按报错中 'user'@'host' 查表、补账号、改插件、赋权限,并确认 bind_address、SSL 要求及网络通路。

Access denied for user 错误不是密码输错了,而是 MySQL 根本没走到校验密码那步——它在查表匹配 'user'@'host' 时就拒绝了连接请求。必须按报错里写的完整组合去验证、补账号、改插件、赋权限,漏一步都连不上。
看报错里的 'user'@'host' 到底是哪个组合
MySQL 把 'root'@'localhost' 和 'root'@'127.0.0.1' 当作两个完全独立账号,哪怕密码一样也不互通。错误信息里写的 host 就是你必须对准的目标。
- 执行
SELECT User, Host FROM mysql.user WHERE User = 'root';,逐行比对输出是否包含报错中一模一样的Host值 - 用
mysql -h 127.0.0.1 -u root -p连,就必须有'root'@'127.0.0.1'这条记录 - 用
jdbc:mysql://127.0.0.1:3306/连,也只会匹配@'127.0.0.1',不会 fallback 到@'localhost' -
'user'@'%'能匹配 IPv4,但不匹配 IPv6 地址(如::1);'user'@'192.168.1.%'不会匹配10.0.0.5
确认认证插件是否兼容客户端
MySQL 5.7+ 默认用 caching_sha2_password,但老版 PHP mysqli、Python MySQLdb、某些监控 Agent、甚至部分 HikariCP 配置只认 mysql_native_password——密码完全正确也会报 Access denied。
- 查当前插件:
SELECT plugin FROM mysql.user WHERE User = 'root' AND Host = 'localhost'; - 若结果是
caching_sha2_password,且你确认客户端不支持,就强制切回:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; - 切完立刻执行:
FLUSH PRIVILEGES;,否则不生效 - 别用
UPDATE mysql.user SET authentication_string = ...—— 字段已废弃,改了也没用
检查自己有没有 GRANT OPTION 权限
MySQL 8.0+ 默认不给 'root'@'localhost' 自带 WITH GRANT OPTION。你以为自己是 root 就能授权,其实不能。执行 GRANT ALL ON db.* TO 'dev'@'%'; 会直接报 Access denied,而不是提示“权限不足”。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 查自己权限:
SHOW GRANTS FOR CURRENT_USER();,重点看输出里是否含WITH GRANT OPTION - 没有就补:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; - MySQL 8.0+ 不允许在
GRANT语句里写IDENTIFIED BY,必须拆成CREATE USER+GRANT两步 - 补完记得
FLUSH PRIVILEGES;,否则新权限不加载
验证端口通了但还是 Access denied 的隐藏原因
哪怕用户、权限、防火墙全对,只要下面任一条件成立,最终仍报 Access denied(而非 Connection refused):
-
bind_address = 127.0.0.1没改 → 远程 TCP 请求被内核直接丢弃,MySQL 压根不参与鉴权 -
require_secure_transport = ON启用时,非 SSL 连接会被静默拒绝,客户端可能只显示超时或模糊错误 - 云服务器安全组未放行 3306 入方向 → 请求到不了
mysqld进程,自然不会触发用户校验 - 验证监听状态:
ss -tlnp | grep :3306,输出中必须含*:3306或具体外网 IP,不能只有127.0.0.1:3306
真正容易被忽略的是 Host 字符串的字面精确匹配——MySQL 不做通配展开,也不自动归一化 IP 或域名。别靠猜,查表、试连、看日志。










