最有效方法是用ALTER USER显式修改指定用户(如'root'@'localhost')的plugin为mysql_native_password并重设密码,再执行FLUSH PRIVILEGES;default_authentication_plugin仅影响新用户,对已有用户无效。

直接改用户认证插件,别碰全局配置——除非你明确要让所有新用户都用旧协议,且接受安全降级。
ALTER USER 切换指定用户的认证方式
这是最常用、最安全的做法。MySQL 8.0 默认用 caching_sha2_password,但旧客户端(如 Navicat 12、PHP mysqlnd 旧版、Python mysqlclient)不支持,连接时直接报错 ERROR 2059 或 Client does not support authentication protocol requested by server。
- 必须精确匹配
user@host:比如你用127.0.0.1连,就得改'root'@'127.0.0.1';用localhost连,就得改'root'@'localhost';远程访问要单独处理'appuser'@'%'或具体 IP - 语法不能省略
BY 'password':只写IDENTIFIED WITH mysql_native_password会清空密码,账号立即锁死 - 执行后必须跟
FLUSH PRIVILEGES:MySQL 8.0.16+ 多数情况自动刷新,但显式执行更稳,避免权限缓存导致改了没生效
示例(本地 root):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_secure_password'; FLUSH PRIVILEGES;
my.cnf 配置 default_authentication_plugin 的真实作用
这个配置项只影响后续 CREATE USER 语句创建的新用户,默认用什么插件——对已存在的用户完全无效,包括刚装完 MySQL 8.0 自带的 root 用户。
- 加在
[mysqld]段里:default_authentication_plugin = mysql_native_password - 修改后必须重启
mysqld(systemctl restart mysqld)才生效 - 它不“禁用”
caching_sha2_password,该插件依然存在,仍可被显式指定使用 - 生产环境慎用:等于放弃 MySQL 8.0 默认引入的 SHA256 加密和 RSA 密钥交换能力,削弱传输层安全性
检查和验证是否生效
别凭感觉,直接查表确认:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果 plugin 字段显示为 mysql_native_password,说明改成功了。如果还是 caching_sha2_password,大概率是 host 不匹配或漏了 FLUSH PRIVILEGES。
- 注意:不同 host 是不同用户,
'root'@'localhost'和'root'@'127.0.0.1'在 MySQL 里是两个独立账号 - 如果提示
ERROR 1396 (HY000),说明该user@host不存在,得先CREATE USER再ALTER - 某些 Docker 客户端连不上,往往是因为容器内用的是
127.0.0.1而不是localhost,host 必须对得上
真正容易被忽略的是 host 匹配粒度——很多问题不是插件没切,而是切错了账号。连不上时第一反应不该是改配置文件,而是先 SELECT user, host, plugin FROM mysql.user; 看清楚你实际连的是哪个账号。



















