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

直接看错误信息里的 'user'@'host' 是什么
MySQL 报的 Access denied for user 'root'@'127.0.0.1' 不是泛指“登录失败”,而是明确告诉你:它在找 'root'@'127.0.0.1' 这个账号,但没找到或认证失败。这个 host 值必须完全匹配——'root'@'localhost' 和 'root'@'127.0.0.1' 在 MySQL 里是两个独立账号,密码一样也不互通。
先执行:SELECT User, Host FROM mysql.user WHERE User = 'root';
对照错误里写的 host,看有没有一模一样的行。没有就说明账号根本不存在,不是密码错,是压根没建。
- 用
mysql -h 127.0.0.1 -u root -p连,就必须有'root'@'127.0.0.1' - 用
mysql -h localhost -u root -p连,走的是 socket,匹配'root'@'localhost' - Spring Boot 配
jdbc:mysql://127.0.0.1:3306/...,也只会找@'127.0.0.1',不是@'localhost'
caching_sha2_password 插件导致老客户端连不上
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';
通过 yarn-threads-cli 与 Threads(Meta)交互。当用户想要阅读首页动态、点赞、收藏的帖子或特定帖子时使用;查看...
- 如果是
caching_sha2_password,且你确认客户端不兼容,就切回来:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; - 切完立刻执行:
FLUSH PRIVILEGES; - 别用
UPDATE mysql.user SET authentication_string = ...—— 字段已废弃,改了也没用
GRANT OPTION 缺失会让 GRANT 命令静默失败
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;,否则不生效
Spring Boot 场景下配置和数据库必须双向对齐
Spring Boot 的 application.yml 里一个缩进错、一个特殊字符没 URL 编码,就会让 JDBC 实际传空密码或错 host。
- 密码含
@、/、:必须编码,比如p@ss/w0rd→p%40ss%2Fw0rd - URL 里写
localhost,但 MySQL 只建了'user'@'127.0.0.1',照样失败 - 加日志确认真实连接参数:
logging.level.com.mysql.cj: TRACE - 别信 IDE 缓存,删掉
target/重编译再试
最常被忽略的是 host 粒度和认证插件的组合问题:同一个用户名,在不同 host 下可能用了不同插件,而你只改了一个。排查时得把 User、Host、plugin 三者当成一个完整键来查。










