直接改用户认证插件最可靠,ALTER USER立即生效且无需重启;需严格匹配host、带密码重置并执行FLUSH PRIVILEGES;caching_sha2_password不兼容旧客户端,应查plugin列后改用mysql_native_password。

直接改用户认证插件,别动全局配置——这是唯一在所有 MySQL 8.0+ 环境(包括云数据库)上立即生效、无需重启、不破坏安全基线的做法。
查清楚当前用户用的是哪个 plugin
连不上不是靠猜的,先登录 MySQL(哪怕用 mysqld --skip-grant-tables 临时进),执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
注意三点:
-
your_user要替换成你实际连接用的用户名,比如app_user或root -
host必须完全匹配:'localhost'、'127.0.0.1'、'%'是三个独立用户条目;Navicat 默认走127.0.0.1,但你可能只改了localhost - 如果
plugin列显示caching_sha2_password,且客户端是 PyMySQL、旧版 PHP mysqli 或 JDBC 5.1.x,基本就是它了
用 ALTER USER 切换单个用户的认证方式
这条语句必须带密码,否则会清空密码导致锁死:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
常见错误和要点:
- 不能只写
SET PASSWORD或ALTER USER ... IDENTIFIED BY—— 这不会改plugin,只是重设哈希值,仍走caching_sha2_password握手流程 -
'your_user'@'127.0.0.1'和'your_user'@'localhost'得分别执行,主机名要一字不差 - 改完必须立刻执行
FLUSH PRIVILEGES;,部分小版本(如 8.0.22 及更早)不刷权限就无效 - 密码需满足
validate_password策略(默认要求 ≥8 位、大小写字母+数字+特殊字符),旧弱密码可能被拒绝
别碰 default_authentication_plugin 配置项
default_authentication_plugin = mysql_native_password 在 my.cnf 里确实能生效,但它只影响后续 CREATE USER 语句在没显式指定 IDENTIFIED WITH 时用哪个插件。对已存在的用户(包括 root)完全无效——这也是为什么很多人配了却还是连不上。
它不解决老客户端连不上 root 的问题,也不是数据字典层面的修改。真正要动的是 mysql.user 表里具体用户的 plugin 字段。
如果你在 Docker 初始化脚本里创建用户,官方镜像(如 mysql:8.0)默认用 caching_sha2_password,这时候光靠 default_authentication_plugin 拦不住——初始化逻辑本身没读这个配置。
最容易被忽略的点:客户端驱动本身是否支持新协议。比如 PHP 7.1 自带的 mysqlnd 不实现 caching_sha2_password 握手流程,也不支持 RSA 密钥交换——哪怕你把用户切回 mysql_native_password,它也可能因驱动 bug 报 SSL connection error 或静默失败。


















