答案是直接修改用户认证插件:登录mysql执行select user, host, plugin from mysql.user where user = 'your_username'确认plugin为caching_sha2_password后,用alter user 'user'@'host' identified with mysql_native_password by 'pwd'并flush privileges生效。

caching_sha2_password 是 MySQL 8.0 默认认证插件,老客户端(如 JDBC 5.1.x、PyMySQL、旧版 Navicat)连不上,报错 Plugin caching_sha2_password could not be loaded 或 Authentication plugin 'caching_sha2_password' cannot be loaded——**直接改用户插件比动全局配置更可靠,且立即生效**。
查清楚当前用户用的是哪个 plugin
连不上不是密码错,是客户端不认识服务端要求的认证方式。先登录 MySQL(mysql -u root -p),执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
注意三点:
-
your_username要替换成你实际连接用的用户名,比如app_user -
host必须严格匹配:'localhost'、'127.0.0.1'、'%'是三个独立条目;Navicat 默认走127.0.0.1,但你可能只改了'localhost' - 如果
plugin列显示caching_sha2_password,且你用的是不支持它的客户端,那基本就是它了
用 ALTER USER 切换单个用户的认证插件
这是所有环境(包括阿里云 RDS、腾讯云 CDB)都支持、无需重启、立竿见影的方法。但必须满足以下条件:
- 语句必须带密码重置:
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';—— 只写IDENTIFIED WITH mysql_native_password会清空密码,导致锁死 -
host要一字不差:'your_username'@'127.0.0.1'和'your_username'@'localhost'得分别执行 - 执行后必须立刻执行
FLUSH PRIVILEGES;,否则部分小版本(如 8.0.22 及更早)不生效 - 密码需满足
validate_password策略(默认 ≥8 位、大小写字母+数字+特殊字符),旧弱密码会被拒绝
my.cnf 配置 default_authentication_plugin(仅限自建库)
这个配置只影响新创建的用户,不能修复已有连接失败问题。但它能防止后续新建用户再踩坑:
- 必须加在
[mysqld]段下,写在[client]或[mysql]段无效 - 正确写法:
[mysqld]<br>default_authentication_plugin = mysql_native_password
- 改完必须
sudo systemctl restart mysqld(不是reload) - 验证是否生效:
SELECT @@default_authentication_plugin;,返回值应为mysql_native_password - 云数据库(RDS/CDB)通常禁止修改该参数,这条路基本走不通
为什么 default_authentication_plugin 经常“改了没用”?
常见失效原因不是配置写错了,而是忽略了它的作用边界:
- 它只对「新用户」生效,已有用户(比如升级前就存在的
root)的plugin字段仍为caching_sha2_password,不受影响 - MySQL 实际加载的 my.cnf 文件可能不是你以为的那个——运行
mysqld --help --verbose | grep "Default options"查真实路径和加载顺序 - 某些 Docker 镜像默认没挂载 my.cnf,得通过启动参数或 entrypoint 注入配置
最易被忽略的一点:即使全局配好了,也得单独处理每个出问题的用户;否则应用照连不上。











