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.1
donne 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 localhost
comme 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 localhost
que 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.0
et ::
, 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 telnet
ne 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.
localhost
au socket mais utilise la mise en réseau. Comme on pouvait s'y attendre naturellement ... Mais la question d'origine demeure.