确认是否为caching_sha2_password插件导致:执行SELECT user,host,plugin FROM mysql.user WHERE user='root';若plugin为caching_sha2_password且客户端不支持,则需ALTER USER'root'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'; FLUSH PRIVILEGES;注意host须与连接时完全一致。

直接改用户认证插件是最可靠、最常用的做法,不用升级客户端,也不依赖配置文件是否生效。
怎么确认真是 caching_sha2_password 导致的连接失败
不是所有“连不上”都是这个原因,先验证:用 MySQL 命令行(比如 phpEnv 自带的、或系统里装的 mysql 客户端)登录,执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果返回的 plugin 字段是 caching_sha2_password,而你用的是 Navicat 12、SQLyog V13.1.9、PHP 7.3/7.4 的 mysqli、旧版 PyMySQL 等,基本就是它了。
- 注意
host必须严格匹配:'root'@'localhost' 和 'root'@'127.0.0.1' 是两个不同用户,得分别查、分别改 - 如果查不到结果,说明用户名或 host 写错了,先用
SELECT user, host FROM mysql.user;看全量列表 - 错误提示里带
Authentication plugin 'caching_sha2_password' cannot be loaded或Client does not support authentication protocol,基本可锁定
执行 ALTER USER 切换插件时必须注意的细节
这条语句看着简单,但漏掉任意一点都会导致失败或锁死自己:
- 必须显式指定密码,不能只写
IDENTIFIED WITH mysql_native_password而省略BY 'xxx'——否则原密码会被清空,下次连不进去了 - host 要和你实际连接时用的一致:Navicat 连
127.0.0.1就得改'root'@'127.0.0.1';连localhost就改'root'@'localhost' - 执行完必须跟
FLUSH PRIVILEGES;,虽然 8.0 多数情况自动刷新,但不加这句在某些部署(尤其是 phpEnv、Docker)下确实不生效 - 如果报
ERROR 1396 (HY000): Operation ALTER USER failed,说明该用户不存在,先用CREATE USER 'root'@'localhost' IDENTIFIED BY 'xxx';创建再改
为什么改 my.cnf 的 default_authentication_plugin 常常没用
很多人改了配置、重启了 MySQL,发现老用户还是连不上——因为这个配置只影响「新创建的用户」,对已存在的 root、admin 等用户完全无效。
-
default_authentication_plugin=mysql_native_password必须放在[mysqld]段下,写在[client]或其他段无效 - 云数据库(如阿里云 RDS、腾讯云 CDB)通常禁止修改配置文件,这条路根本走不通
- phpEnv、XAMPP 等集成环境的 MySQL 启动脚本常忽略自定义
my.ini设置,尤其 Windows 下注册为服务后更难生效 - 即使配置生效,也只解决未来新建用户的兼容性,已有问题用户仍需单独
ALTER USER
改完还连不上?重点检查这几个隐性坑
插件改对了,但连接仍失败,大概率卡在这几个地方:
- Navicat / SQLyog 缓存了旧连接配置,关掉软件重开,或删掉该连接重新建一个
- PHP 代码里用了
localhost当 host,MySQL 会走 socket 连接,有时绕过插件协商逻辑;换成127.0.0.1更稳 - 密码含
@、/、\等字符,Navicat 或 URL 形式连接串解析失败,临时换纯字母数字密码验证 - php.ini 里
extension=mysqli和extension=pdo_mysql被注释了,改完没重启 Apache/Nginx/PHP-FPM
真正容易被忽略的是:host 匹配粒度比想象中细,localhost ≠ 127.0.0.1 ≠ ::1,每个都得单独处理,不能只改一个就以为全搞定了。











