MySQL 8.0 默认认证插件变为caching_sha2_password,旧客户端不兼容;可临时改用mysql_native_password或升级驱动并配置allowPublicKeyRetrieval=true&useSSL=false。

MySQL 8.0 连接报错 caching_sha2_password plugin is not loaded 怎么办
这是 MySQL 8.0 默认认证插件变更导致的典型兼容性问题。服务端启用了 caching_sha2_password,但客户端(尤其是旧版 JDBC、MySQL CLI、PHP mysqli)不支持或未启用对应插件,直接拒绝握手。
检查当前用户认证插件并临时切回 mysql_native_password
先确认出问题的用户用的是哪个插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
如果返回 caching_sha2_password,且你暂时不想升级客户端,可手动降级认证方式:
- 执行
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 务必跟上
FLUSH PRIVILEGES; - 注意:该操作会禁用 SHA2 加密,仅建议在内网、测试环境或短期过渡时使用
Java 应用连不上?JDBC URL 必须加 allowPublicKeyRetrieval=true&useSSL=false
MySQL Connector/J 8.0+ 默认要求安全连接,而 caching_sha2_password 在首次握手时需公钥交换——旧驱动没实现该流程,新驱动又默认拒绝不安全行为。
- 完整推荐连接参数:
jdbc:mysql://localhost:3306/db?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false -
allowPublicKeyRetrieval=true是关键,否则抛Public Key Retrieval is not allowed -
useSSL=false非必须,但若服务端没配证书,不加会卡在 SSL 握手阶段 - 驱动版本至少用
8.0.16+,低于此版本即使加参数也可能失败
Python / Node.js / 命令行客户端连不上?优先升级驱动或显式指定插件
不同客户端处理方式差异大,不能一概而论:
- Python
pymysql:不原生支持caching_sha2_password,换用mysql-connector-python或PyMySQL≥1.0.2 + 设置auth_plugin='caching_sha2_password' - Node.js
mysql2:需显式传参authPlugin: 'caching_sha2_password',且版本 ≥2.0.0 - 命令行
mysql客户端:5.7 及更早版本无法连接;必须升级到 8.0+ 客户端,或启动时加--default-auth=mysql_native_password - Docker 场景下容易忽略:宿主机 MySQL 客户端版本 ≠ 容器内应用所用驱动版本,要分别检查
真正麻烦的不是改哪一行配置,而是不同组件链路中任意一环卡在旧协议上——比如 Spring Boot 应用用了新版驱动,但中间件(如 ShardingSphere)内置的连接池仍绑定了老 JDBC 包,这种隐式依赖最容易漏查。











