Die MySQL-Verbindung funktioniert mit localhost, jedoch nicht mit 127.0.0.1

9

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.

Philipp Jardas
quelle
Der Grund , warum ich die Fehler von meiner Java - Anwendung erhalten , ist , dass der JDBC - Treiber nicht lösen localhostzu der Socket aber Anwendungen zu vernetzen. Wie man es natürlich erwarten würde ... Aber die ursprüngliche Frage bleibt.
Philipp Jardas

Antworten:

1

Der Täter schien zu sein hosts.denyund hosts.allowdie standardmäßig einen Dateimodus von haben 0x600. MySQL konnte sie nicht lesen, um festzustellen, ob Verbindungen zulässig sind. Ich habe den Dateimodus auf geändert 0x644und jetzt läuft alles reibungslos. Ich frage mich immer noch, warum MySQL keine Fehler protokolliert hat ...

Philipp Jardas
quelle
0

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.

Nebu
quelle
Die Antwort, die Sie gepostet haben, beantwortet eine Frage, die genau das Gegenteil von meiner ist. Und ich habe sowohl Netzwerk- als auch Dateisockets aktiv.
Philipp Jardas
Ja, du hast recht. Entschuldigung, habe deine Frage falsch verstanden.
Nebu
0

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

TBI Infotech
quelle
In der Tat löst localhost sowohl 127.0.0.1als auch ::1. Ich habe versucht, MySQL zu binden ::1, keine Änderung. Ich habe sogar versucht, MySQL an 0.0.0.0und zu binden ::, kein Unterschied.
Philipp Jardas
0

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":

skip-name-resolve       = on

Wenn Sie dies tun, verwendet MySQL lo länger rDNS zum Auflösen 127.0.0.1-> localhostund da alle meine GRANTs für sind user@localhost, darf der Benutzer keine Verbindung vom Host herstellen 127.0.0.1.

Für dieses spezielle Problem gibt es zwei Lösungen:

  1. Deaktivieren skip-name-resolve
  2. Erweitern Sie Ihre GRANTs, um 127.0.0.1sowie einzuschließenlocalhost
Christopher Schultz
quelle