La connexion MySQL fonctionne avec localhost mais pas avec 127.0.0.1

9

J'ai une installation MySQL assez standard sur Debian Wheezy ( apt-get install mysql-server mysql-client), ce que j'ai fait avec succès plusieurs fois auparavant.

Lorsque j'essaie de me connecter via localhost, tout fonctionne. Mais la connexion via 127.0.0.1donne un message d'erreur:

$ 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

Lorsque j'essaie de me connecter à partir d'une application Java, j'obtiens des erreurs similaires, bien que j'utilise localhostcomme nom d'hôte:

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.

J'obtiens généralement cette exception lorsque le serveur MySQL a fermé une connexion inactive ou a été redémarré. Cependant, cela se produit maintenant au démarrage de l'application lorsque l'application essaie de se connecter pour la première fois.

Assez drôle, cela a fonctionné quelques heures auparavant. Malheureusement, je ne me souviens pas avoir changé quoi que ce soit sur le serveur. :-(

Donc, pour être honnête, ce type de message contient deux questions: pourquoi ne puis-je pas me connecter via 127.0.0.1? Et pourquoi mes applications ne peuvent-elles pas se connecter via alors localhostque je peux via CLI?

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

ÉDITER

J'ai essayé de lier le serveur à 0.0.0.0et ::, en vain.

Le serveur prend en charge IPv6 et est configuré en conséquence:

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

Le même problème que celui décrit ci-dessus se produit lorsque j'essaie de me connecter ::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

EDIT 2

La connexion via telnetne donne pas beaucoup d'informations mais montre que la connexion est immédiatement fermée.

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

Soit dit en passant, les fichiers journaux MySQL sont totalement silencieux même avec la journalisation activée.

Philipp Jardas
la source
La raison pour laquelle j'obtiens les erreurs de mon application Java est que le pilote JDBC ne se résout paslocalhost au socket mais utilise la mise en réseau. Comme on pouvait s'y attendre naturellement ... Mais la question d'origine demeure.
Philipp Jardas

Réponses:

1

Le coupable semblait être hosts.denyet hosts.allowqui, par défaut, a un mode de fichier 0x600. MySQL n'a pas pu les lire pour déterminer s'il fallait autoriser les connexions. J'ai changé les modes de fichier en 0x644, et maintenant tout se passe bien. Je me demande toujours pourquoi MySQL n'a pas enregistré d'erreurs ...

Philipp Jardas
la source
0

Cette question est très similaire à MySQL ne peut pas se connecter via "localhost", seulement 127.0.0.1 . Comme indiqué ici, vous avez probablement configuré MySQL pour écouter uniquement le socket réseau et non le socket du système de fichiers.

Nebu
la source
La réponse que vous avez publiée répond à une question qui est exactement le contraire de la mienne. Et j'ai à la fois la mise en réseau et les sockets de fichiers actifs.
Philipp Jardas
Oui, tu as raison. Désolé d'avoir mal lu votre question.
Nebu
0

Vous pouvez avoir IPv6 activé, son hôte local très possible se résout en hôte local ipv6, qui n'est pas défini dans votre configuration mysql.

Vous pouvez vérifier cela en voyant si «host localhost» sur la ligne de commande renvoie :: 1 ainsi que 127.0.0.1. Si c'est le cas, vous pouvez soit supprimer le mappage :: 1 soit reconfigurer MySQL pour écouter sur l'adresse IPv6 :: 1 ainsi que 127.0.0.1

TBI Infotech
la source
En effet, localhost résout à la fois 127.0.0.1et ::1. J'ai essayé de lier MySQL ::1, sans changement. J'ai même essayé de lier MySQL 0.0.0.0et ::, aucune différence.
Philipp Jardas
0

J'ai récemment cassé une installation de travail où la plupart des clients sont basés sur Java. Les outils CLI fonctionneraient, mais les clients Java se sont tous arrêtés net dans leur élan. Dans mon cas, le coupable était un nouveau paramètre que j'avais activé "pour améliorer les performances":

skip-name-resolve       = on

Lorsque vous faites cela, MySQL utilise plus longtemps rDNS pour résoudre 127.0.0.1-> localhostet, puisque tous mes GRANTs sont pour user@localhost, l'utilisateur n'est pas autorisé à se connecter depuis l'hôte 127.0.0.1.

Il existe deux solutions à ce problème particulier:

  1. Désactiver skip-name-resolve
  2. Développez votre GRANTs pour inclure 127.0.0.1ainsi quelocalhost
Christopher Schultz
la source