真正起效的操作是用ALTER USER显式修改具体用户的plugin字段为mysql_native_password并重设密码,且必须执行FLUSH PRIVILEGES;default_authentication_plugin配置仅影响新用户,对已有用户完全无效。

不能直接“修改默认身份验证插件”来修复已有用户连接失败的问题——这是最常被误解的点。真正起效的操作是改具体用户的 plugin 字段,而不是调配置项。
查清楚当前用户到底用的哪个 plugin
连不上不是因为“默认插件设错了”,而是你正在用的那个用户(比如 app_user 或 root)实际认证方式是 caching_sha2_password,而客户端不支持。先登录 MySQL(用 root 或其他高权限账号)执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
注意三点:
-
your_username要替换成你应用里实际写的用户名,比如webapp -
host必须严格匹配:'localhost'、'127.0.0.1'、'%' 是三个完全不同的用户条目;Navicat 默认走127.0.0.1,但很多人只改了localhost,结果白忙 - 如果
plugin列显示caching_sha2_password,且你用的是旧版 PyMySQL、JDBC 5.x、PHP mysqli 7.x 等,那问题就锁定了
用 ALTER USER 显式切换单个用户的认证插件
这是唯一在所有环境(包括阿里云 RDS、腾讯云 CDB、本地 Docker)都立即生效的方法。语法必须完整:
ALTER USER 'app_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_actual_password';
常见踩坑点:
- 不能只写
SET PASSWORD或ALTER USER ... IDENTIFIED BY—— 这类语句不会动plugin字段,握手时仍走caching_sha2_password流程 - 主机名必须一字不差:如果你建用户时是
'app_user'@'192.168.1.%',就不能写成'app_user'@'%' - 密码必须显式提供:
BY 'xxx'不可省略;MySQL 8.0+ 不保留原密码哈希,漏写等于清空密码 - 执行后立刻跟
FLUSH PRIVILEGES;,部分小版本(如 8.0.22 及更早)不刷就不会生效
为什么改 default_authentication_plugin 配置经常没用
这个配置项只影响「新创建的用户」,对已存在的所有用户(包括 root、app_user、repl_user)完全无效。它常被误认为是“全局开关”,其实只是个“新用户模板”。
如果你真要改(仅限自建、可控服务器),步骤是:
- 编辑
/etc/mysql/my.cnf或/etc/my.cnf,在[mysqld]段下加一行:default_authentication_plugin=mysql_native_password - 重启 MySQL:
sudo systemctl restart mysql(注意是restart,不是reload) - 重启后新建的用户才默认用
mysql_native_password;老用户仍需手动ALTER USER - 云数据库(RDS/CDB)通常禁止修改该配置,这条路根本走不通
验证是否真的生效
别靠“能连上就完事”,要确认 plugin 字段确实变了:
SELECT user, host, plugin FROM mysql.user WHERE user = 'app_user';
输出中对应行的 plugin 必须是 mysql_native_password。如果还是 caching_sha2_password,说明前面某步 host 写错了,或者没执行 FLUSH PRIVILEGES。
最常被忽略的一点:物理迁移或克隆实例后,mysql.user 表直接从旧库拷贝过来,里面混着不同版本的插件记录——用户“存在”,但认证逻辑已经和当前 MySQL 8.0 的默认行为不匹配。这时候光看版本号没用,必须查表、改字段、刷权限,三步缺一不可。


















