MySQL 8.0连接失败大概率是客户端不支持caching_sha2_password插件,需执行SELECT user, host, plugin FROM mysql.user WHERE user='your_user'确认插件类型,若为caching_sha2_password且使用Navicat 15及更早、PHP 7.3及更早、旧JDBC或PyMySQL等,则确为此问题。

MySQL 8.0 连接失败,大概率不是密码错了,而是客户端压根不认识 caching_sha2_password 这个插件——它在握手阶段就卡死,报错如 Authentication plugin 'caching_sha2_password' cannot be loaded 或 ERROR 2059。
怎么确认真是 caching_sha2_password 搞的鬼
caching_sha2_password 搞的鬼别猜,直接查服务端当前用户的认证方式:
用能连上的方式(比如 mysql -u root -p)登录后执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看 plugin 列。如果显示 caching_sha2_password,且你用的是以下任一环境,基本就是它了:
- Navicat 15 及更早版本
- PHP 7.3 及更早 +
mysqli扩展 - JDBC 驱动
mysql-connector-java:5.1.x或未更新的 6.x/7.x - PyMySQL
- Docker 默认镜像启动的旧版客户端工具
注意:'root'@'localhost' 和 'root'@'127.0.0.1' 是两个独立用户,必须分别查、分别改。
ALTER USER 改单个用户最安全,但必须带密码
这是影响最小、见效最快的方案,只动目标用户,不碰全局配置,也不用重启 MySQL:
-
必须显式重设密码:只写
IDENTIFIED WITH mysql_native_password而省略BY 'pwd',会导致密码被清空,账户直接锁死 - 改本地连接:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 改远程连接(如 Navicat 连服务器):
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 如果你用
127.0.0.1连(Navicat 默认行为),还得单独加一句:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 改完立刻执行:
FLUSH PRIVILEGES;,否则不生效
如果提示 ERROR 1396 (HY000),说明该用户不存在,得先 CREATE USER 再改。
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
my.cnf 的 default_authentication_plugin 只对新用户生效
default_authentication_plugin 只对新用户生效在 [mysqld] 段加:
default_authentication_plugin=mysql_native_password
它只影响之后新建的用户,对已存在的用户(比如安装时创建的 root)完全无效。
很多人改完就重启 MySQL,发现还是连不上——因为 root 的 plugin 字段仍是 caching_sha2_password,没被自动更新。
云数据库(如阿里云 RDS)通常禁写 /etc/my.cnf,这条路根本走不通;Docker 场景下可用 --default-authentication-plugin=mysql_native_password 启动参数,但同样不修复存量用户。
Navicat / JDBC / PyMySQL 连不上?别只盯着服务端
服务端改完,客户端常因缓存或配置细节继续失败:
- Navicat 会缓存连接配置,改完服务端后不删旧连接、不重建,它可能还在用旧握手逻辑重试
- JDBC 连接串里光加
useSSL=false不够,老驱动(5.1.x)根本不认识新协议;必须升级到mysql-connector-java:8.0.28+,并加allowPublicKeyRetrieval=true - PyMySQL mysqlclient 则需 ≥2.1.0
- 密码含
@、/等特殊字符时,URL 解析可能出错——建议 URL 编码或换用配置文件方式传参
最容易被忽略的一点:你改的是 'user'@'localhost',但应用实际连的是 'user'@'192.168.1.100',而这个用户根本没处理过。


















