Ich habe eine ziemlich normale MySQL-Installation auf Debian Wheezy ( apt-get install mysql-server mysql-client), die ich schon oft erfolgreich durchgeführt habe.
Wenn ich versuche, eine Verbindung über localhostherzustellen, funktioniert alles. Die Verbindung über 127.0.0.1gibt jedoch eine Fehlermeldung aus:
$ 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
Wenn ich versuche, eine Verbindung über eine Java-Anwendung herzustellen, werden ähnliche Fehler angezeigt, obwohl ich sie localhostals Hostnamen verwende:
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.
Normalerweise erhalte ich diese Ausnahme, wenn der MySQL-Server eine inaktive Verbindung geschlossen oder neu gestartet wurde. Dies geschieht jetzt jedoch beim Start der Anwendung, wenn die Anwendung zum ersten Mal versucht, eine Verbindung herzustellen.
Komischerweise hat das erst ein paar Stunden zuvor funktioniert. Leider kann ich mich nicht erinnern, etwas auf dem Server geändert zu haben. :-(
Um ehrlich zu sein, enthält dieser Beitrag zwei Fragen: Warum kann ich keine Verbindung herstellen 127.0.0.1? Und warum können meine Anwendungen keine Verbindung herstellen, localhostobwohl ich dies über die CLI kann?
# 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"
BEARBEITEN
Ich habe versucht, den Server an 0.0.0.0und ::zu binden , ohne Erfolg.
Der Server unterstützt IPv6 und ist entsprechend konfiguriert:
# host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
Das gleiche Problem wie oben beschrieben tritt auf, wenn ich versuche, eine Verbindung herzustellen ::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
BEARBEITEN 2
Die Verbindung über telnetgibt nicht viele Informationen, zeigt jedoch, dass die Verbindung sofort geschlossen wird.
# telnet localhost 3306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
Übrigens sind die MySQL-Protokolldateien auch bei aktivierter Protokollierung völlig geräuschlos.
localhostzu der Socket aber Anwendungen zu vernetzen. Wie man es natürlich erwarten würde ... Aber die ursprüngliche Frage bleibt.