MySQL 8.0默认认证插件改为caching_sha2_password导致旧客户端连接失败,解决方法是为现有用户执行ALTER USER ... IDENTIFIED WITH mysql_native_password,并FLUSH PRIVILEGES;或修改my.cnf中default_authentication_plugin并重启mysqld。

MySQL 8.0 默认 auth_plugin 变成 caching_sha2_password 了
应用连不上 MySQL,报错 Plugin caching_sha2_password could not be loaded 或 Client does not support authentication protocol,基本就是这个原因。MySQL 5.7 升到 8.0 后,default_authentication_plugin 从 mysql_native_password 切成了 caching_sha2_password,而老客户端(比如旧版 JDBC、PHP mysqli、某些 Python MySQL 驱动)压根不认这个新插件。
- 不是所有客户端都支持
caching_sha2_password:JDBC 8.0+、MySQL Connector/Python 8.0+ 才默认兼容;旧版驱动会直接拒连 - 改配置只影响新创建的用户,已存在的用户不会自动刷新认证方式
- 临时绕过方案(如加
?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false)治标不治本,还可能引入安全或时区问题
快速修复:给现有用户切回 mysql_native_password
不用动全局配置,直接重置出问题的用户认证方式最稳妥。假设你的应用用的是用户名 app_user,连接的是本地数据库:
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 必须指定
WITH mysql_native_password,光用SET PASSWORD不生效 -
'app_user'@'%'要和建用户时的 host 完全一致,查当前用户用SELECT User, Host FROM mysql.user; - 执行完记得
FLUSH PRIVILEGES;,否则部分版本不立即生效 - 如果用户是
localhost,注意 MySQL 8.0 对localhost的解析更严格,有时得用127.0.0.1测试连接
一劳永逸:修改 my.cnf 并重启 mysqld
如果你控制数据库服务器,且确认所有客户端都能升级或适配,可以改全局默认插件;但更常见的情况是——干脆统一回退到兼容性更好的老插件:
[mysqld] default_authentication_plugin = mysql_native_password
- 配置必须放在
[mysqld]段下,写在[client]或其他段无效 - 改完要重启
mysqld,不是 reload;systemd 下用sudo systemctl restart mysqld - 重启后新建的用户才会默认用
mysql_native_password,已有用户仍需单独ALTER USER - 某些云数据库(如阿里云 RDS、腾讯云 CDB)不开放 my.cnf 修改权限,这条路走不通,只能走用户级修复
Java 应用连不上?检查 JDBC URL 和驱动版本
即使服务端改了插件,Java 应用也可能因驱动太老继续报错。关键点不在 URL 参数,而在驱动本身:
- JDBC 5.1.x / 6.0.x 完全不支持
caching_sha2_password,必须升到 8.0.11+ - URL 加
allowPublicKeyRetrieval=true是为了配合新插件握手,但如果服务端已切回mysql_native_password,这个参数反而可能触发警告甚至被新驱动拒绝 - Maven 依赖要明确指定新版:
mysql:mysql-connector-java:8.0.33(别用runtimescope 隐式引入旧版) - Spring Boot 2.4+ 默认带 8.x 驱动,但若项目里显式 exclude 了,或用了
spring-boot-starter-jdbc而没锁版本,仍可能拉到低版本
最常被忽略的是:改了用户认证方式后没重启应用,连接池里还缓着旧的失败连接;或者开发环境切了插件,测试环境忘了同步。连不上时,先 mysql -u app_user -p -h your-host 手动试一次,排除网络和权限之外的所有干扰。










