错误日志
2025-11-17 10:11:08 ERROR 21740 --- [论坛系统] [eate-1546318093] com.alibaba.druid.pool.DruidDataSource :
create connection SQLException, url: jdbc:mysql://localhost:3306/forum_db?useSSL=false&serverTimezone=UTC,
errorCode 0, state 08001
java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
问题描述
Spring Boot 在启动项目时,数据库连接池(Druid)无法创建 MySQL 连接,抛出:
Public Key Retrieval is not allowed
出现原因
MySQL 8 默认用户认证方式为 caching_sha2_password。
当客户端(JDBC)尝试连接数据库时,需要从服务器获取 RSA 公钥。如果 MySQL 未允许客户端获取公钥,就会报:
Public Key Retrieval is not allowed
Spring Boot + MySQL 8 在未加入某些参数时就会发生此问题。
解决方法(推荐)
在 application.yml 的数据源 URL 中加入:
allowPublicKeyRetrieval=true
✔ 正确配置示例:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/forum_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
username: root
password: 密码
可选解决方案(不推荐)
将 MySQL 用户认证方式改成旧版本的 mysql_native_password:
sql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;
不推荐用此方式,因为安全性较低。
最终结论
这是 MySQL 8 的认证机制导致的连接问题,通过在 JDBC URL 中加入:
allowPublicKeyRetrieval=true
即可解决,属于常见的 MySQL 8 JDBC 连接参数问题。