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.Réponses:
Le coupable semblait être
hosts.deny
ethosts.allow
qui, par défaut, a un mode de fichier0x600
. MySQL n'a pas pu les lire pour déterminer s'il fallait autoriser les connexions. J'ai changé les modes de fichier en0x644
, et maintenant tout se passe bien. Je me demande toujours pourquoi MySQL n'a pas enregistré d'erreurs ...la source
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.
la source
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
la source
127.0.0.1
et::1
. J'ai essayé de lier MySQL::1
, sans changement. J'ai même essayé de lier MySQL0.0.0.0
et::
, aucune différence.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":
Lorsque vous faites cela, MySQL utilise plus longtemps rDNS pour résoudre
127.0.0.1
->localhost
et, puisque tous mesGRANT
s sont pouruser@localhost
, l'utilisateur n'est pas autorisé à se connecter depuis l'hôte127.0.0.1
.Il existe deux solutions à ce problème particulier:
skip-name-resolve
GRANT
s pour inclure127.0.0.1
ainsi quelocalhost
la source