处理Java程序MySQL连接报错:Public Key Retrieval is not allowed 【测试成功】

艺帆风顺 发布于 2025-04-02 16 次阅读


一、问题背景    服务器重启后,重启MySQL 8版本数据库,查看java后台日志,出现报错信息。

    log4j:WARN No appenders could be found for logger (com.alibaba.druid.pool.DruidDataSource).log4j:WARN Please initialize the log4j system properly.16:03:46.074 [main] ERROR org.activiti.engine.impl.interceptor.CommandContext - Error while closing command contextorg.activiti.engine.ActivitiException: couldn't check if tables are already present using metadata: Public Key Retrieval is not allowedat org.activiti.engine.impl.db.DbSqlSession.isTablePresent(DbSqlSession.java:1144) ~[activiti-engine-5.22.0.jar!/:5.22.0]at org.activiti.engine.impl.db.DbSqlSession.isEngineTablePresent(DbSqlSession.java:1094) ~[activiti-engine-5.22.0.jar!/:5.22.0]at org.activiti.engine.impl.db.DbSqlSession.dbSchemaUpdate(DbSqlSession.java:1027) ~[activiti-engine-5.22.0.jar!/:5.22.0]

    二、问题分析

    • 问题分析:表示 Activiti 引擎在启动时无法检查数据库表是否存在, MySQL 连接配置不允许获取公钥。
    • 原因:     使用了 MySQL 8 或更高版本,并且使用了新的默认身份验证插件( caching_sha2_password),连接配置没有允许获取公钥。
      • Activiti 引擎: Activiti 是一个流程引擎,需要在数据库中存储流程定义和运行时数据。
      • couldn't check if tables are already present using metadata: 在启动时,Activiti 引擎会检查数据库中是否存在必要的表。
      • Public Key Retrieval is not allowed:由 MySQL 驱动程序引起的。身份验证插件需要检索服务器的公钥,默认情况下,为了安全被禁用。

    三、问题解决    解决方法:  添加连接参数 allowPublicKeyRetrieval=true    修改后的配置文件连接信息如下:

      url:  jdbc:mysql://10.21.3.221:3303/db?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true

      重新启动java程序,可以看到已经恢复正常。