mysql报access denied主因是'user'@'host'组合不匹配或认证插件不兼容;需严格比对错误中'root'@'127.0.0.1'与mysql.user表记录,确认该账号存在、plugin为mysql_native_password且具备grant option权限。

错误不是密码输错了,而是 MySQL 明确拒绝了 'user'@'host' 这个组合的认证请求;必须按报错里写的完整用户名和 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'
确认认证插件是否兼容客户端
MySQL 5.7+ 默认用 caching_sha2_password,但老版 PHP mysqli、Python MySQLdb、某些监控 Agent、甚至部分 HikariCP 配置只认 mysql_native_password —— 密码完全正确也会报 Access denied。
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
- 查当前插件:
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,而不是提示“权限不足”。
- 查自己权限:
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;,否则新权限不加载
最容易被忽略的是:报错停在哪一步,决定了排查方向。如果 mysql -h 127.0.0.1 -u root -p 命令行都连不上,问题一定在服务端账号、插件或网络;如果命令行能连上,但 Spring Boot 启动失败,就得盯死 spring.datasource.url 里的 host 是否和账号 host 完全一致,以及驱动版本是否支持当前认证插件。










