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.Respuestas:
El culpable parecía ser
hosts.deny
yhosts.allow
que por defecto tiene un modo de archivo de0x600
. MySQL no pudo leerlos para determinar si permitir conexiones. Cambié los modos de archivo a0x644
, y ahora todo funciona sin problemas. Todavía me pregunto por qué MySQL no registró ningún error ...fuente
Esta pregunta es muy similar a MySQL no se puede conectar a través de "localhost", solo 127.0.0.1 . Como se indicó aquí, probablemente configuró MySQL para escuchar solo el zócalo de la red y no el zócalo del sistema de archivos.
fuente
Es posible que tenga habilitado IPv6, su muy posible localhost se resuelve en ipv6 localhost, que no está definido en su configuración de mysql.
Puede verificar esto al ver si 'host localhost' en la línea de comando devuelve :: 1 y 127.0.0.1. Si es así, puede eliminar la asignación :: 1 o volver a configurar MySQL para escuchar en la dirección IPv6 :: 1, así como 127.0.0.1
fuente
127.0.0.1
y::1
. Intenté vincular MySQL a::1
, sin cambios. Incluso intenté vincular MySQL0.0.0.0
y::
, no hay diferencia.Recientemente rompí una instalación en funcionamiento en la que la mayoría de los clientes están basados en Java. Las herramientas CLI funcionarían, pero todos los clientes Java se detuvieron en seco. En mi caso, el culpable era una nueva configuración que había habilitado "para mejorar el rendimiento":
Cuando haces esto, MySQL lo usa por más tiempo rDNS para resolver
127.0.0.1
->localhost
y, dado que todos mis correos electrónicosGRANT
son parauser@localhost
, el usuario no puede conectarse desde el host127.0.0.1
.Existen dos soluciones para este problema particular:
skip-name-resolve
GRANT
electrónicos para incluir127.0.0.1
ylocalhost
fuente