Tengo una instalación bastante estándar de MySQL en Debian Wheezy ( apt-get install mysql-server mysql-client
) que he hecho con éxito muchas veces antes.
Cuando intento conectarme vía localhost
, todo funciona. Pero conectarse a través de 127.0.0.1
da un mensaje de error:
$ 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
Cuando intento conectarme desde una aplicación Java obtengo errores similares, aunque estoy usando localhost
como nombre de host:
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.
Por lo general, recibo esta excepción cuando el servidor MySQL ha cerrado una conexión inactiva o se ha reiniciado. Sin embargo, esto sucede ahora al inicio de la aplicación cuando la aplicación intenta conectarse por primera vez.
Divertido lo suficiente este hizo el trabajo sólo unas horas antes. Lamentablemente, no recuerdo haber cambiado nada en el servidor. :-(
Para ser honesto, esta publicación contiene dos preguntas: ¿Por qué no puedo conectarme 127.0.0.1
? ¿Y por qué mis aplicaciones no pueden conectarse a través de localhost
aunque yo puedo a través de 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"
EDITAR
Intenté vincular el servidor 0.0.0.0
y ::
, sin éxito.
El servidor admite IPv6 y está configurado en consecuencia:
# host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
El mismo problema descrito anteriormente ocurre cuando intento conectarme ::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
EDITAR 2
La conexión a través de telnet
no proporciona mucha información, pero muestra que la conexión se cierra de inmediato.
# telnet localhost 3306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
Por cierto, los archivos de registro de MySQL son totalmente silenciosos incluso con el registro habilitado.
localhost
en el socket sino que usa la red. Como uno esperaría naturalmente ... Pero la pregunta original permanece.