MySQL 8.0默认认证插件caching_sha2_password导致老客户端连接失败,必须显式执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd'并FLUSH PRIVILEGES;配置default_authentication_plugin仅影响新用户,不改变已有用户plugin字段。

MySQL 8.0 默认用 caching_sha2_password,老客户端连不上、应用报错“Authentication plugin 'caching_sha2_password' cannot be loaded”,基本就是它在拦路——改插件不是可选项,是刚需。
确认当前 root 用户用的是哪个认证插件
别猜,直接查:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果返回 caching_sha2_password,而你的客户端不支持(比如旧版 Navicat、某些 JDBC 驱动、PHP 7.4 以下),那就必须动手改。常见误操作是只改配置文件却忘了更新已有用户,结果 root 还是连不上。
- 新用户受
default_authentication_plugin控制,已有用户完全不受影响 -
plugin字段为空或mysql_native_password才能兼容绝大多数旧工具 - 执行
ALTER USER后必须跟FLUSH PRIVILEGES;,否则变更不生效
临时改单个用户(适合快速验证)
登录后直接执行,立刻生效,不用重启:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_secure_password';<br>FLUSH PRIVILEGES;
注意:'root'@'localhost' 要和你实际连接的 host 完全一致(比如远程连可能是 'root'@'%'),否则改了也白改。
- 如果提示
ERROR 1396 (HY000),说明该用户不存在,先用CREATE USER创建再改 - 密码必须满足当前
validate_password策略,否则报错ERROR 1819 - 改完立刻测试连接,别等重启后再试——这是验证是否真生效的最快方式
永久改默认插件(影响所有新用户)
编辑 my.cnf,在 [mysqld] 段加一行:
default_authentication_plugin=mysql_native_password
但关键点在于:你得先确认 MySQL 实际加载的是哪个配置文件。运行这条命令看真实路径:
mysqld --help --verbose | grep "Default options"
输出里排第一的那个文件才是生效的(通常是 /etc/my.cnf 或 /etc/mysql/my.cnf)。改错文件位置等于没改。
- 改完必须
sudo systemctl restart mysqld,reload不重读这个参数 - 重启后新建用户(如
CREATE USER 'test'@'%' IDENTIFIED BY '123';)的plugin字段应为mysql_native_password - 如果新建用户仍是
caching_sha2_password,八成是配置文件路径错了,或没写在[mysqld]下
为什么改了 default_authentication_plugin 还连不上?
因为已有用户(尤其是升级保留下来的 root)的 plugin 字段不会自动变。配置只管“未来”,不管“过去”。最常踩的坑就是:改了配置、重启了服务、新建用户能连,但 root 死活登不进。
- 必须显式执行
ALTER USER更新每个已有用户的plugin字段 - 远程用户要单独处理:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '...'; - 如果用户有多个 host(
localhost、127.0.0.1、%),每个都要单独改
复杂点在于:你得同时盯住 default_authentication_plugin(控制新用户)、mysql.user.plugin(控制已有用户)、以及 validate_password 组件状态(它可能拦着你设弱密码)。三者不协同,就卡在某一步上不动。


















