bugfix> java > 投稿

Dockerコンテナで実行されるMySQLを使用するJavaアプリで作業しています。最近、Windows環境からMac OSに切り替えましたが、JDBCを使用してJavaコードでデータベースに接続できません。 MySQL Workbenchを使用してコマンドラインクライアントからデータベースに接続できます。

Docker for Macを使用します(つまり、デフォルトの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に戻した後、動作しているようです!

ヘルプやヒントは大歓迎です!

回答 1 件
  • Dockerイメージでmysql8を使用しており、認証の実装が異なります。

    caching_sha2_password を参照  以下のリンクの変更

    認証プラグイン「caching_sha2_password」をロードできません

    https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html

    そのため、当面はmysqlバージョンを5.7にダウングレードしてみてください。
    サイドノートでは、リンクを介してmysql-8で適切な手順を使用します。 jdbc-connectorの次のリンクをご覧ください。
    https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatible-connectors

あなたの答え