错误源于MySQL 8.0+默认认证插件caching_sha2_password要求RSA公钥交换,而JDBC驱动默认禁止动态获取公钥;解决方式包括:①在DBeaver驱动属性中设allowpublickeyretrieval=true(开发可配useSSL=false),②或执行ALTER USER语句改用mysql_native_password认证以兼顾兼容性与安全性。

为什么连接MySQL 8.0+会报“Public Key Retrieval is not allowed”
这个错误不是网络或权限问题,而是MySQL 8.0+默认用caching_sha2_password认证插件后,JDBC驱动(包括DBeaver、Navicat、Java应用等)出于安全考虑,默认禁止从服务端动态获取RSA公钥。只要客户端没显式说“允许取公钥”,连接就直接失败。
典型触发场景:用DBeaver连本地MySQL 8.0、Spring Boot项目启动时报java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed、PyMySQL连接时抛pymysql.err.OperationalError: (2059, ...)。
DBeaver里怎么快速关掉这个报错
不用改MySQL配置,直接在连接属性里开开关就行:
- 右键已报错的连接 → 编辑连接
- 切换到 驱动属性(Driver Properties) 标签页
- 找到
allowPublicKeyRetrieval,把它设为true(如果没看到,点右上角 显示高级属性 或搜关键词) -
useSSL建议按环境配:false(开发机直连)、true(生产环境且已配好SSL证书)
保存后点“测试连接”,通常立刻成功。注意:新创建的连接默认仍为false,每次新建都得手动设一次。
Java JDBC URL里加参数怎么写才有效
在jdbc:mysql://连接串末尾拼参数,顺序和大小写不敏感,但必须是URL编码格式:
jdbc:mysql://localhost:3306/mydb?allowPublicKeyRetrieval=true&useSSL=false
常见踩坑点:
- 漏掉
&(不是&),导致后续参数被当数据库名解析 - 把
allowpublickeyretrieval写成allowpublickeyretrieve或驼峰allowPublicKeyRetrieval——JDBC驱动只认小写下划线形式 -
useSSL=false和allowPublicKeyRetrieval=true一起用时,密码明文走TCP,仅限可信内网;生产环境必须配SSL并设verifyServerCertificate=true
彻底避免这个问题:换回mysql_native_password认证
这是长期更稳的选择,尤其适合多客户端混用或生产环境:
- 用root登录MySQL:
mysql -u root -p - 执行(把
'user'和'host'替换成实际值):ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
- 刷新权限:
FLUSH PRIVILEGES;
改完后所有旧工具(包括老版本Navicat、PHP mysqli)都能直连,也不用开allowPublicKeyRetrieval这种有MITM风险的开关。但要注意:如果MySQL服务器强制要求SSL连接(REQUIRE SSL),还得额外给用户授SSL权限。
真正麻烦的不是改哪一行配置,而是得确认所有调用方——比如某个Python脚本用PyMySQL、另一个服务用Druid连接池、还有运维用的命令行——它们是否都支持caching_sha2_password。不统一的话,总有一处会突然断连。


















