繁体   English   中英

无法使用JDBC连接到docker中的本地MySQL

[英]Can't connect to local MySQL in docker with JDBC

我正在使用Java应用程序,该应用程序使用在Docker容器中运行的MySQL。 我最近从Windows环境切换到Mac OS,并且无法使用JDBC使用Java代码连接到数据库。 我可以使用MySQL Workbench连接到数据库,也可以从命令行客户端连接到数据库。

我使用适用于Mac的Docker(即没有默认的Docker计算机)。

我以此启动我的Docker容器:

CONTAINER_NAME=hypo-mysql
PORT="3306:3306"
VOLUME_FROM="hypo-mysql-data"
CONFIG_DIR="$(pwd)/conf.d"
MYSQL_ROOT_PASSWORD="xxxxx"
MYSQL_USER="hypo"
MYSQL_PASSWORD="doktorBenArmsson"
MYSQL_DATABASE="Hypo"

docker run --name ${CONTAINER_NAME} \
            -p ${PORT} \
            --volumes-from ${VOLUME_FROM} \
            -v ${CONFIG_DIR}:/etc/mysql/conf.d \
            -e MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} \
            -e MYSQL_USER=${MYSQL_USER} \
            -e MYSQL_PASSWORD=${MYSQL_PASSWORD} \
            -e MYSQL_DATABASE=${MYSQL_DATABASE} \
            -d --restart=always mysql \

当我启动Java应用程序时,我开始出现此错误:

Caused by: java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.

由于我的JDBC驱动程序不支持MySQL使用的新身份验证方法,因此我将用户改为使用旧的本机方法:

mysql> select user, host, plugin from user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| hypo             | %         | caching_sha2_password |
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

ALTER USER 'hypo'@'%' IDENTIFIED WITH mysql_native_password BY ‘xxxxxxx’;

mysql> select user, host, plugin from user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| hypo             | %         | mysql_native_password |
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

现在我从Java得到以下错误:

Caused by: java.sql.SQLException: Unknown system variable 'query_cache_size'

我在gradle中升级了JDBC驱动程序:

//old driver: compile 'mysql:mysql-connector-java:5.1.38'
compile 'mysql:mysql-connector-java:5.1.46'

现在我从Java得到这个错误:

Caused by: java.io.IOException: Keystore was tampered with, or password was incorrect
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:780)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)
    at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
    at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)
    at java.security.KeyStore.load(KeyStore.java:1445)
    at com.mysql.jdbc.ExportControlled.getSSLSocketFactoryDefaultOrConfigured(ExportControlled.java:381)
    ... 27 more
Caused by: java.security.UnrecoverableKeyException: Password verification failed
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:778)

但是我无法弄清楚该错误的实际含义或消除该错误的方法。 我知道密码是正确的,因为我通过Workbench连接时使用了相同的密码。 但是,有关密钥库的消息使我感到困惑...我一开始并没有接触密钥库,但是后来我尝试重新生成密钥库文件,但是我仍然从Java收到相同的错误消息。

更新:我为MySQL重新创建了我的docker容器,并明确使用了版本5:

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
8bf6b9ddd29f        mysql:5             "docker-entrypoint.s…"   15 seconds ago      Up 13 seconds       0.0.0.0:3306->3306/tcp   hypo-mysql
1a0add303fe0        mysql:5             "docker-entrypoint.s…"   4 minutes ago       Created                                      hypo-mysql-data

docker exec -it hypo-mysql bash
mysql --version
mysql  Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using  EditLine wrapper

在我恢复到原始的jdbc驱动程序版本5.1.38之后,它似乎可以正常工作!

任何帮助和提示,我们将不胜感激!

您正在docker映像中使用mysql8,它具有不同的身份验证实现。

在以下链接中查看caching_sha2_password更改

所以暂时尝试将mysql版本降级到5.7。
并在旁边注意通过链接对mysql-8使用正确的步骤。 看一下jdbc-connector的以下链接。
https://dev.mysql.com/doc/refman/8.0/zh-cn/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatible-connectors

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM