确认是caching_sha2_password导致连接失败:执行select user, host, plugin from mysql.user where user = 'your_username',若plugin列为caching_sha2_password,且客户端为php 7.x mysqli、navicat 12以下等不支持该插件的旧版本,即为此问题;须对对应'user'@'host'执行alter user identified with mysql_native_password by 'pwd'并立即flush privileges。

不是密码错了,是客户端根本不认识 caching_sha2_password 插件——MySQL 8.0 默认用它,但 PHP 7.x 的 mysqli、Navicat 12 以下、Node.js 的 mysql 包、JDBC 5.x 等压根不支持。
怎么确认真是 caching_sha2_password 导致的?
别猜,直接查。用 root 登录后执行:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'your_username';
如果 plugin 字段返回 caching_sha2_password,而你用的是以下任一组合,基本就是它:
- PHP 7.x 的
mysqli或旧版mysqlnd - Navicat 12 或更早版本
- Node.js 的
mysql(非mysql2) - JDBC 驱动低于
mysql-connector-java:8.0.28
典型报错包括:SQLSTATE[HY000] [2054]、ER_NOT_SUPPORTED_AUTH_MODE、Authentication plugin 'caching_sha2_password' cannot be loaded。
ALTER USER 后还是连不上?三个常见漏点
执行了 ALTER USER 'u'@'h' IDENTIFIED WITH mysql_native_password BY 'pwd' 却仍失败,大概率卡在这三处:
- 忘了
FLUSH PRIVILEGES:权限变更不会自动生效,必须手动刷新 -
Host不匹配:应用连的是'u'@'192.168.1.100',你只改了'u'@'localhost';用SELECT user(), current_user();看实际连接来源 - 用户不存在或密码为空:MySQL 8.0 对空密码或弱密码有校验,
ALTER USER可能静默失败;先用强密码重置再改插件
为什么改 default_authentication_plugin 没用?
这个配置项只影响新创建的用户,对已有用户完全无效。升级后所有老用户仍沿用原 plugin 值,必须逐个 ALTER USER。日志里看不到错误,但问题照旧——这是最常白忙活的操作。
真正要动的是用户级认证方式,不是配置文件。批量处理可用:
SELECT CONCAT('ALTER USER ''',User,'''@''',Host,''' IDENTIFIED WITH mysql_native_password BY ''temp_pwd'';') FROM mysql.user WHERE plugin = 'caching_sha2_password';
生成语句后人工核对再执行,避免误操作。
注意:authentication_string 是哈希值,不能当明文密码用;临时切回 mysql_native_password 是最快通路,但生产环境长期用它会削弱密码哈希强度;更稳妥的做法是升级客户端驱动,比如 PHP 改用 mysqlnd8.0+,JDBC 加 ?allowPublicKeyRetrieval=true&serverTimezone=UTC。











