MySQL 8 连接报错:Public Key Retrieval is not allowed

错误日志

复制代码
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 连接参数问题。


相关推荐
丙氨酸長鏈6 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
独行侠影a6 小时前
APScheduler+Redis 分布式定时任务:解决多实例任务重复执行
数据库·redis·分布式
传说故事7 小时前
数据库中一些常用英文单词含义
数据库·oracle
夏贰四7 小时前
中小企业搭建业务中台如何控成本?业务中台轻量化落地分几步实施?
数据库·业务中台
林焱RPA8 小时前
影刀RPA200篇纪念版:最实用的20个自动化场景大盘点
数据库
名字还没想好☜8 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
每天都要进步哦10 小时前
SQL单行函数详解:字符、数字、日期、转换与通用函数全解析
数据库·mysql
不剪发的Tony老师10 小时前
VeloxDB:一款免费开源的轻量级数据库管理工具
数据库·sql
dotnet9010 小时前
批量生成所有表的修改脚本
数据库·sql·oracle
@Mike@10 小时前
06-数据库学习笔记(存储模型与数据压缩)
数据库·笔记·学习