使用Liquibase连接MariaDB(MemSQL+Java)遇RSA公钥错误求助
问题:Liquibase连接MariaDB(MemSQL)时出现RSA公钥不可用错误
我尝试运行以下Bash脚本,通过Liquibase对MariaDB(MemSQL)执行数据库迁移:
#!/bin/bash if [ "$( docker container inspect -f '{{.State.Status}}' iam_db )" == "exited" ]; then echo db is down, starting db... docker start iam_db sleep 10 fi echo migrating db... If it fails after recreating, please wait for about 1 minute before rerunning set -o xtrace liquibase --defaultsFile iam/db/liquibase/liquibase.properties --url jdbc:mariadb://${MEMSQL_HOST}:3306/${MEMSQL_IAM_DB}?createDatabaseIfNotExist=true --username=${MEMSQL_USER:-root} --password=${MEMSQL_PASSWORD:-123456} --classpath $MARIADB_CONNECTOR_LOCATION --logLevel severe migrate set +o xtrace
但遇到无法解决的错误:
ERROR: Exception Details ERROR: Exception Primary Class: SQLException ERROR: Exception Primary Reason: RSA public key is not available client side (option serverRsaPublicKeyFile not set) ERROR: Exception Primary Source: 4.27.0 [2024-05-14 21:16:46] SEVERE [liquibase.integration] Connection could not be created to jdbc:mariadb://localhost:3306/iam_ingestion?createDatabaseIfNotExist=true with driver org.mariadb.jdbc.Driver. RSA public key is not available client side (option serverRsaPublicKeyFile not set) liquibase.exception.CommandExecutionException: liquibase.exception.DatabaseException: liquibase.exception.DatabaseException: liquibase.exception.DatabaseException: liquibase.exception.DatabaseException: Connection could not be created to jdbc:mariadb://localhost:3306/iam_ingestion?createDatabaseIfNotExist=true with driver org.mariadb.jdbc.Driver. RSA public key is not available client side (option serverRsaPublicKeyFile not set)
已尝试的操作:
- 更换MariaDB、Java、Liquibase的版本
- 修改JDBC URL为
jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true&useSSL=false
解决方案
针对这个RSA公钥错误,有以下几种可行的解决方式:
1. 调整JDBC URL参数(推荐)
保持使用jdbc:mariadb://协议,在原有URL后添加allowPublicKeyRetrieval=true和useSSL=false参数,适配MemSQL的驱动兼容逻辑:
jdbc:mariadb://${MEMSQL_HOST}:3306/${MEMSQL_IAM_DB}?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false
2. 指定服务器RSA公钥文件
如果不想开启公钥自动检索,可从MemSQL服务器获取公钥文件后,在JDBC URL中指定路径:
jdbc:mariadb://${MEMSQL_HOST}:3306/${MEMSQL_IAM_DB}?createDatabaseIfNotExist=true&serverRsaPublicKeyFile=/path/to/public_key.pem
获取公钥可通过在MemSQL客户端执行SHOW VARIABLES LIKE 'server_public_key';命令查看,或从服务器配置文件中提取。
3. 修改MemSQL用户身份验证插件
测试环境下,可将用户身份验证插件改为mysql_native_password,绕过RSA公钥验证:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES;
需根据实际用户名和主机访问范围调整命令。
内容的提问来源于stack exchange,提问作者Ohad Shirazi
相关产品推荐
相关产品推荐

