質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.04%

eclipseで別のPCのMysqlサーバへの接続

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,896

tohokukagaku

score 10

 前提・実現したいこと

eclipse neon4.6を使用しています
別のPCのMysqlにアクセスしようとすると次のようなエラーが出てしまいます。
どのようにすれば解決できますか?

MysqlサーバのあるPCでは問題なく処理できています。

 発生している問題・エラーメッセージ

Thu Jul 26 11:54:42 JST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'test'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2480)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2438)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1381)
at test.TestSql.main(TestSql.java:25)

 該当のソースコード

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class TestSql {

public static void main(String[] args) {
String url = "jdbc:mysql://PCのID:3306/データベース名?autoReconnect=true&useSSL=false";
String user = "mysql";
String pass = "パスワード";
String sql = "SELECT * FROM 商品表";
String com = "";

try{

Class.forName("com.mysql.jdbc.NonRegisteringDriver");

Connection conn = (Connection)DriverManager.getConnection(url,user,pass);
Statement stmt = conn.createStatement();
ResultSet rs =  stmt.executeQuery(sql);
rs.next();
com = rs.getString("短縮名");
System.out.println(com);

rs.close();
stmt.close();
conn.close();
System.out.print("成功");

} catch (Exception e) {
System.out.println("JDBCドライバのロードに失敗しました。");
}
}

}

 試したこと

データベース名の後の ?autoReconnect=true&useSSL=false" を削除しても同じエラーが出ました。
Class.forName("com.mysql.jdbc.NonRegisteringDriver"); を削除しても同じエラーが出ました。

eclipseのプラグインのDBViewerからは接続できましたが、
コードからだとエラーが出てしまうようです。

 補足情報(FW/ツールのバージョンなど)

eclipse neon4.6
mysql5.7

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

2点ご確認ください。

 接続先のデータベース

エラーメッセージに"Unknown database "と出ているので接続先データベースが見つかっていないように思います。
jdbc urlに指定しているデータベース名は正しいでしょうか?

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'test'

もし、ローカルPCにmysqlかmysql clientがインストールされている場合、次のコマンドでアクセスできるかご確認ください。

> mysql.exe --host=接続先ホスト名 --port=3306 --user=ユーザー --password=パスワード --database=データベース名

 接続先のホスト名

ご提示されたコードのjdbc urlには"PCのID"と書かれていますが、これは実際のコードでは接続先の”ホスト名”または”ホストのIP”が書かれているということでしょうか?
A5:SQL Mk-2では接続できるとのことですが、このツールのDB接続設定のホスト名の内容と同一でしょうか?

String url = "jdbc:mysql://PCのID:3306/データベース名?autoReconnect=true&useSSL=false";

念のため、コマンドプロンプトからpingで疎通できるかご確認ください。

> ping 接続先のホスト名

それと、ちょっと気になっている点があります。質問文の以下の

別のPCのMysqlにアクセスしようとすると次のようなエラーが出てしまいます。

"別のPC"というのは、チームで開発する際に複数のメンバーで接続する用途のいわゆるサーバータイプのPCでしょうか?
ちょっと気になっただけなので、差支えがあればお答え頂かなくても結構です。

 確認点 (2018/08/08追加)

コメントありがとうございます。ローカルからmysql.exeでは接続できないけど、A5:SQL Mk-2からは接続できるということなので、もう少し状況確認をさせてください。

結果追記 (2018/08/10)

確認点をコメントして頂いたので、見やすいようにそれぞれの項目に結果を追記しました。

 bind_addressとportの確認

MySQL serverが実行されているPC上で、mysql.exeを使ってrootユーザーでログインして次のsqlを実行してください。
このsqlの結果を確認したいと思います。

bind_address

> show variables like '%bind%';

結果追記

bind_address *

1 row in set, 1 warning (0.27 sec)

port

> show variables like '%port%';

結果追記

innodb_support ON
large_files_support ON
port 3306
report_host
report_password
report_port 3306
report_user
require_secure_transport OFF

8 rows in set, 1 warning(0.00 sec)

 netstatでportの確認

MySQL serverが実行されているPC上で、Windowsのnetstatコマンドの結果を確認したいです。
出力結果が長いかもしれませんが"ローカル アドレス"の欄にx.x.x.x:3306のような結果があるか確認してください。この場合の3306は上記で確認したportに読み替えてください。(上記のportの確認結果がたとえば13306だったら、x.x.x.x:13306を確認する、という意味です。)

コマンドプロントを立ち上げ次のコマンドを実行してください。

> netstat -anoptf TCP

下記の例のような行があるかを確認したいです。

アクティブな接続

  プロトコル  ローカル アドレス      外部アドレス           状態            PID      オフロード状態

  TCP         0.0.0.0:3306           0.0.0.0:0              LISTENING       18596       ホスト内

ローカルアドレスに上記の例のような行がある場合、さらにtohokukagakuさんのPCからA5:SQL Mk-2で接続して、再度結果を確認してください。
このときの外部アドレスがどのように変わったか確認したいです。

結果追記

はじめは下記の例と同じ内容が行がありました(PIDのみ違う数字)
A5:SQL Mk-2に接続後も変わらず同じ数字で存在しましたが、新しく下記の行が増えました。(pidとオフロード状態は同じ数字でした。)

ローカルアドレス      外部アドレス                 状態      
接続先ホストのID:3306  接続先ホストのIDの下二桁のみ違う数字:50525 ESTABLISHED

 DBユーザーのアクセス権限

MySQL serverが実行されているPC上で、mysql.exeを使ってrootユーザーでログインして次のsqlを実行してください。
このsqlの結果を確認したいと思います。
仮に、接続したいユーザー名が'test_user'だとしたら、以下のようなsqlになると思います。
'test_user'の部分は、実際に接続したいユーザーの名前に読み替えてください。(eclipseのプログラムやA5:SQL Mk-2から接続するときのユーザー名です。)

> select user,host from mysql.user where user = 'test_user';

下記は一例ですが、hostに

  • 'localhost'があるか
  • tohokukagakuさんのPCのIPアドレスがあるか(たとえば、tohokukagakuさんのPCのIPが10.0.75.1だとしたら、下記のように10.0.75.%かもしくは10.0.75.1があるか)

の点を確認したいと思います。

+---------------+-------------+
| user          | host        |
+---------------+-------------+
| test_user     | 10.0.75.%   |
| test_user     | localhost   |
+---------------+-------------+

結果追記

myspl %

1 rdw in set(0.05 sec)

また、以下のshow grantsで接続したいユーザーが接続したいデータベースに権限が付与されているか確認したいです。
このsql文の'test_user'@'10.0.75.%'の部分は実際に接続したいユーザーに読み替えてください。

> show grants for 'test_user'@'10.0.75.%';

下記は一例ですが、GRANT ALL PRIVILEGES ON test.* TO 'test_user'@'10.0.75.%' のような行があるか確認したいです。

+-----------------------------------------------------------------------+
| Grants for test_user@10.0.75.%                                        |
+-----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test_user'@'10.0.75.%'                         |
| GRANT ALL PRIVILEGES ON `test`.* TO 'test_user'@'10.0.75.%'           |
+-----------------------------------------------------------------------+

結果追記

Grants for mysql`%

GRANT ALL PRIVILEGES ON *.* TO "mysql"@"%" WITH GRANT OPTION

 MySQL serverが実行されているPCからの接続

上記のアクセス権限の確認結果にlocalhostが含まれている場合に、この確認を行って頂きたいです。

tohokukagakuさんのPCからmysql.exeでは接続できなかったということですが、MySQL serverが実行されているPCからの接続はどうでしょうか?
MySQL serverが稼働しているPCから、mysql.exeを使って接続したいユーザーでログインできるか確認してください。
test_userとtest_passの部分は実際に接続したいユーザー名とパスワードに読み替えてください。

> mysql.exe --host=localhost --port=3306 --user=test_user --password=test_pass --database=test

 ローカルPCから接続できなかったときのエラーメッセージ

頂いたコメントで、ローカルPCからは接続できなかったということですが、このときのエラーメッセージはどのようなものでしょうか?

> mysql.exe --host=接続先ホスト名 --port=3306 --user=ユーザー --password=パスワード --database=データベース名
試してみましたが接続することができませんでした。

結果追記

ローカルPCからの接続エラーは下記のように出ました。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysql.exe --host=接続先ホストID --port=3306 --user=mysql --password=パスワード -' at line 1

また、データベース名の指定ですが、A5:SQL Mk-2の接続設定のデータベースの欄の名前です。この場合はデータベース名とスキーマ名は同じと考えてよいと思います。

自分は接続先データベース名は A5:SQL Mk-2 のスキーマと同じだと思い、"test" にしているのですがもしかして間違いでしたか?

A5:SQL Mk-2からは接続できるということですが、たとえば、A5:SQL Mk-2の接続設定が下図のようなものだとして、

イメージ説明

下記のように同じ設定でもmysql.exeからは接続できないということでしょうか?
設定は、tohokukagakuさんのPCのA5:SQL Mk-2の接続設定に読み替えてください。

> mysql.exe --host=10.75.0.200 --port=3306 --user=test_user --password=test_pass --database=test

結果追記

A5:SQL Mk-2からは接続設定と
mysql.exe --host=10.75.0.200 --port=3306 --user=test_user --password=test_pass --database=test
を見比べましたが、違いはありませんでした。

 ローカルPCにMySQL serverはインストールされていますか

mysql.exeで接続確認をされたということですが、ローカルPCにMySQL serverがインストールされているということでしょうか?
もしそうであれば、ローカルPCのMySQL serverが稼働していてA5:SQL Mk-2がそこへ接続しているということはないでしょうか?

結果追記

ローカルPCのmysqlにはtestというデータベースは作成していませんのでA5:SQL Mk-2がそこへ接続しているということはないと思います。

以上、すこし項目が多いですがご確認ください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/13 17:01

    1) MySQLが稼働しているPCのJavaアプリケーションからは接続できる
    2) 他のPCのJavaアプリケーションからは接続できない
    3) この2つのPCで実行するJavaアプリケーション(ソースコードやライブラリのバージョン)に差異はない
    上記につきましては間違いありません。
    ただしMySQLのバージョンは
    MySQLが稼働しているPCでは mysql5.7を
    他のPCでは mysql8.0を使用しています。

    1) Javaのバージョン
     Version 8 Update 181
    2) 開発ツールとそのバージョン
     eclipse neon4.6
    3) ビルドツール(Maven or Gradle or etc.)とそのバージョン
     eclipseにデフォルトで設定してあるビルドツールを使っています。
    4) MySQL Connector/Jのバージョン
     mysql-connector-java-5.1.45bin.jar

    上記のバージョンを使っています。

    キャンセル

  • 2018/09/27 21:45

    コメントありがとうございます。
    同じアプリケーション(ソースコードやライブラリが同一)なのに、実行するPCによって繋がるPCと繋がらないPCがあるということですね。
    また、以前に確認して頂いた接続情報も正しいことが分かっていますので、プログラム側には問題がないように思います。
    ここまで来ると、後は繋がらないPCの環境を実地で調べてみるしかないと思いますが、私の方でそこまですることはできませんので、大変申し訳ありませんがお力になれるのはここまでのようです。
    大変残念ですが、あとは他のユーザーから回答が付くのをお待ち頂くか、実地で調査できる方に協力を仰いで頂きたいと思います。

    キャンセル

  • 2018/10/23 16:29

    何度も質問に答えていただきありがとうございました。
    大変勉強になりました。
    ベストアンサーに選ばせていただきます。

    キャンセル

0

MySQL 側の設定は skip_ssl になっていますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/30 13:29

    返信が遅れて申し訳ありません。
    他のサイトでエラーの原因がSSLではないかという記事を見ましてそれで無効にしようとしていただけですので、有効でもエラーが起きないのでしたらどちらでも大丈夫です。

    さっそく試してみたのですが同じエラーが出てしまいました。

    キャンセル

  • 2018/07/31 09:17

    SSL接続がOFFの時も、ONの時も同じエラーが出るとなると、ネットワーク的な問題か、あるいはちゃんとした証明書が無い状態になってしまっているのだと思います。
    DB名の後ろを"?useSSL=true&requireSSL=true"の状態にするとどうなるでしょうか?
    また、conf/application.yml の environments: の記述はどうなっているでしょうか?

    キャンセル

  • 2018/08/01 14:45

    DB名の後ろは変えても同じエラーが出てしまいました。

    もしかして、SSL証明書がない場合、外部からの接続は不可能なのでしょうか?
    SSL証明書の作り方がよくわからず自分は作成していないのですが、
    eclipseのDBViewer やA5:SQL Mk-2 ではSSLなしで接続できていたため関係ないと思っていました。

    キャンセル

0

別のPCのMySQLの設定は、外部ホストから接続できるようになっているでしょうか?
以下のMySQLで以下のSQL実行してhost列にホスト名またはIPアドレスが無かったら外部から接続できません。

SQL> select user,host from mysql.user;
+---------+-------------------------+
| user    | host                    |
+---------+-------------------------+
| root    | 127.0.0.1               |
| root    | ::1                     |
|         | localhost               |
| root    | localhost               |
|         | {ホスト名}               |
| root    | {ホスト名}               |
+---------+-------------------------+

【参考】

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/27 14:44

    回答してくださり、ありがとうございます。
    外部接続については% になっているため大丈夫かと思われます。

    キャンセル

0

1.useSSLおよびrequireSSLをFalseにしてSSLは利用しないようにする。(warningへの対応)
※本当であればSSL通信が良い。

2.com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'test'
テストという名前のDBが見つかっていないようなので、
そもそものその対応をする。
rubytomatoさんが御指摘の内容の対応になると思います。

String url = "jdbc:mysql://PCのID:3306/データベース名?autoReconnect=true&useSSL=false&requireSSL=false

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る