MySQL接続はlocalhostでは機能しますが、127.0.0.1では機能しません


9

Debian Wheezy(apt-get install mysql-server mysql-client)にはかなり標準的なMySQLインストールがあり、これまで何度も成功しています。

経由localhostで接続しようとすると、すべてが機能します。しかし、経由で接続127.0.0.1するとエラーメッセージが表示されます。

$ mysql -h localhost -P 3306 -u xxx -p
-- works

$ mysql -h 127.0.0.1 -P 3306 -u xxx -p
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

localhostホスト名として使用しているにもかかわらず、Javaアプリケーションから接続しようとすると、同様のエラーが発生します。

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure. The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

通常、MySQLサーバーがアイドル接続を閉じたとき、または再起動したときに、この例外が発生します。ただし、これはアプリケーションが初めて接続しようとするアプリケーションの起動時に発生します。

面白いことに、これほんの数時間前に機能しました。残念ながら、サーバー上で何かを変更したことを思い出せません。:-(

正直に言うと、この投稿には2つの質問が含まれています。なぜ接続できないの127.0.0.1ですか?また、localhostCLIを介して接続できても、アプリケーションが接続できないのはなぜですか?

# mysqld -V
mysqld  Ver 5.5.37-0+wheezy1-log for debian-linux-gnu on x86_64 ((Debian))

# mysql -V
mysql  Ver 14.14 Distrib 5.5.37, for debian-linux-gnu (x86_64) using readline 6.2

# grep bind /etc/mysql/my.cnf
bind-address = 127.0.0.1

# grep socket /etc/mysql/my.cnf
socket = /var/run/mysqld/mysqld.sock

# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.022 ms

# grep localhost /etc/hosts
127.0.0.1 localhost
::1     ip6-localhost ip6-loopback

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

# netstat -ln | grep 3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

tomcat # grep mysql conf/server.xml
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/dbname"

編集

サーバーを0.0.0.0とにバインドしようとしましたが::、役に立ちませんでした。

サーバーはIPv6をサポートし、それに応じて構成されます。

# host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1

に接続しようとすると、上記と同じ問題が発生し::1ます。

# ping6 ::1
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.020 ms

# ping6 localhost
64 bytes from ip6-localhost: icmp_seq=1 ttl=64 time=0.018 ms

編集2

経由で接続telnetすると、多くの情報は得られませんが、接続がすぐに閉じられることが示されます。

# telnet localhost 3306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

ちなみに、MySQLログファイルはロギングが有効になっていても完全にサイレントです。


Javaアプリケーションからエラーが発生する理由は、JDBCドライバーがソケットに解決されlocalhost、ネットワークを使用するためです。自然に予想されるように...しかし、元の質問は残っています。
Philipp Jardas 14

回答:


1

犯人はらしいのでhosts.denyhosts.allowデフォルトではファイルモードは0x600です。MySQLはそれらを読み取って、接続を許可するかどうかを判断できませんでした。ファイルモードをに変更すると0x644、すべてがスムーズに実行されます。MySQLがエラーをログに記録しなかった理由を私はまだ疑問に思っています...


0

この質問は、MySQLが「localhost」経由で接続できないのと非常によく似ています。127.0.0.1のみです。ここで述べたように、おそらくファイルシステムソケットではなくネットワークソケットのみをリッスンするようにMySQLを設定しました。


あなたが投稿した答えは私のものと正反対の質問に答えます。また、ネットワークとファイルソケットの両方をアクティブにしています。
Philipp Jardas 14

はい、あなたは正しいです。ごめんなさい、あなたの質問を読み間違えました。
ネブ2014

0

IPv6が有効になっている可能性があります。その可能性のあるlocalhostは、mysql構成で定義されていないipv6 localhostに解決されます。

これは、コマンドラインの 'host localhost'が:: 1と127.0.0.1を返すかどうかで確認できます。その場合は、:: 1マッピングを削除するか、MySQLを再構成してIPv6 :: 1アドレスと127.0.0.1で待機するようにします。


実際に両方に解決さはlocalhost 127.0.0.1とします::1。MySQLを::1にバインドしてみましたが、変更はありません。MySQLを0.0.0.0::にバインドしてみても違いはありません。
Philipp Jardas 14

0

私は最近、ほとんどのクライアントがJavaベースの動作しているインストールを壊しました。CLIツールは機能しましたが、Javaクライアントはすべて、トラックで完全に停止しました。私の場合、犯人は「パフォーマンスを向上させる」ために私が有効にした新しい設定でした。

skip-name-resolve       = on

これを行うと、MySQL loは解決のためにrDNSを使用します127.0.0.1-> localhost、そしてすべてGRANTのはを対象user@localhostとしているため、ユーザーはhostからの接続を許可されません127.0.0.1

この特定の問題には2つの解決策があります。

  1. 無効にする skip-name-resolve
  2. あなたの展開GRANT含めるのを127.0.0.1だけでなく、localhost
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.