根本原因是客户端不支持caching_sha2_password插件的握手逻辑,导致认证阶段直接报错;需先用命令行确认用户plugin值,再针对性执行ALTER USER切换为mysql_native_password并指定密码,最后FLUSH PRIVILEGES生效。

连不上不是密码错了,是客户端压根不认识 caching_sha2_password 这个插件——它在 MySQL 8.0+ 默认启用,但旧版 Navicat、PHP 7.3、老 JDBC 驱动、phpEnv 等工具根本没实现它的握手逻辑,直接卡在认证阶段报错。
确认是不是 caching_sha2_password 搞的鬼
先别改配置,用能连上的方式(比如 mysql -u root -p)登录 MySQL 命令行,执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看 plugin 列。如果显示 caching_sha2_password,且你用的是 Navicat 15 以下、Django 3.0 以下、PHP 7.3 或更老环境,基本就是它了。
-
'root'@'localhost'和'root'@'127.0.0.1'是两个独立用户,得分别查、分别处理 - 如果查不到目标用户,说明连接时用的账号根本不存在,错误会是
ERROR 1045,不是插件问题
用 ALTER USER 切换认证插件(最常用)
这是见效最快、影响最小的方式,只改单个用户,不碰全局配置,也不用重启 MySQL:
- 改本地用户:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 改远程用户(比如 Navicat 从本机连服务器):
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 必须显式指定密码,不能省略
BY——否则密码被清空,账户直接锁死 - 改完立刻执行:
FLUSH PRIVILEGES;,否则不生效 - 如果提示
ERROR 1396 (HY000),说明该用户不存在,得先CREATE USER再改
注意 my.cnf 里 default_authentication_plugin 的真实作用
在 [mysqld] 段加 default_authentication_plugin=mysql_native_password,只影响「之后新建的用户」,对已存在的用户完全无效。
- 很多人改完就以为 root 能连了,结果发现还是报错——因为 root 是安装时创建的,早就用
caching_sha2_password加密了 - Docker 场景下可在
command里加参数启动,但已有数据照样得手动ALTER USER - 云数据库(如阿里云 RDS)不给你改配置或重启权限,只能靠
ALTER USER
遇到 Plugin 'mysql_native_password' is not loaded 怎么办
这通常出现在 MySQL 8.4+ 或某些禁用了旧插件的 8.0 环境中,说明 mysql_native_password 插件本身被关掉了。
- 先检查插件状态:
SHOW PLUGINS WHERE Name = 'mysql_native_password';,如果Status不是ACTIVE,就得启用它 - 在
my.cnf的[mysqld]段加:mysql_native_password=ON(MySQL 8.4+ 不再支持default_authentication_plugin,改用authentication_policy=mysql_native_password) - 加完必须重启 MySQL 服务,否则不生效
- 如果实在无法启用旧插件,就别硬切——升级客户端驱动(如 PyMySQL、Connector/J)、或在连接串里加
allowPublicKeyRetrieval=true&useSSL=false来适配caching_sha2_password
真正容易被忽略的是:Navicat 缓存旧连接配置、host 字符串不匹配(localhost vs 127.0.0.1)、密码含特殊字符未正确转义——这些细节比插件切换本身更容易导致反复失败。


















