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 localhost
herzustellen, funktioniert alles. Die Verbindung über 127.0.0.1
gibt 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 localhost
als 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, localhost
obwohl 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.0
und ::
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 telnet
gibt 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.
localhost
zu der Socket aber Anwendungen zu vernetzen. Wie man es natürlich erwarten würde ... Aber die ursprüngliche Frage bleibt.Antworten:
Der Täter schien zu sein
hosts.deny
undhosts.allow
die standardmäßig einen Dateimodus von haben0x600
. MySQL konnte sie nicht lesen, um festzustellen, ob Verbindungen zulässig sind. Ich habe den Dateimodus auf geändert0x644
und jetzt läuft alles reibungslos. Ich frage mich immer noch, warum MySQL keine Fehler protokolliert hat ...quelle
Diese Frage ist sehr ähnlich zu MySQL kann keine Verbindung über "localhost" herstellen, nur 127.0.0.1 . Wie hier angegeben, haben Sie MySQL wahrscheinlich so konfiguriert, dass nur der Netzwerk-Socket und nicht der Dateisystem-Socket abgehört wird.
quelle
Möglicherweise ist IPv6 aktiviert. Der sehr mögliche lokale Host wird in den ipv6-lokalen Host aufgelöst, der in Ihrer MySQL-Konfiguration nicht definiert ist.
Sie können dies überprüfen, indem Sie feststellen, ob 'host localhost' in der Befehlszeile :: 1 sowie 127.0.0.1 zurückgibt. In diesem Fall können Sie entweder die :: 1-Zuordnung entfernen oder MySQL neu konfigurieren, um die IPv6 :: 1-Adresse sowie 127.0.0.1 abzuhören
quelle
127.0.0.1
als auch::1
. Ich habe versucht, MySQL zu binden::1
, keine Änderung. Ich habe sogar versucht, MySQL an0.0.0.0
und zu binden::
, kein Unterschied.Ich habe kürzlich eine funktionierende Installation abgebrochen, bei der die meisten Clients Java-basiert sind. Die CLI-Tools würden funktionieren, aber die Java-Clients blieben alle stehen. In meinem Fall war der Schuldige eine neue Einstellung, die ich aktiviert hatte, um "die Leistung zu verbessern":
Wenn Sie dies tun, verwendet MySQL lo länger rDNS zum Auflösen
127.0.0.1
->localhost
und da alle meineGRANT
s für sinduser@localhost
, darf der Benutzer keine Verbindung vom Host herstellen127.0.0.1
.Für dieses spezielle Problem gibt es zwei Lösungen:
skip-name-resolve
GRANT
s, um127.0.0.1
sowie einzuschließenlocalhost
quelle