La conexión MySQL funciona con localhost pero no con 127.0.0.1

9

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.1da 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 localhostcomo 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 localhostaunque 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.0y ::, 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 telnetno 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.

Philipp Jardas
fuente
La razón por la que obtengo los errores de mi aplicación Java es que el controlador JDBC no se resuelve localhosten el socket sino que usa la red. Como uno esperaría naturalmente ... Pero la pregunta original permanece.
Philipp Jardas

Respuestas:

1

El culpable parecía ser hosts.denyy hosts.allowque por defecto tiene un modo de archivo de 0x600. MySQL no pudo leerlos para determinar si permitir conexiones. Cambié los modos de archivo a 0x644, y ahora todo funciona sin problemas. Todavía me pregunto por qué MySQL no registró ningún error ...

Philipp Jardas
fuente
0

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.

Nebu
fuente
La respuesta que publicó responde a una pregunta que es exactamente lo opuesto a la mía. Y tengo activos de red y de archivos.
Philipp Jardas
Sí, tiene usted razón. Lo siento, leí mal tu pregunta.
Nebu
0

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

TBI Infotech
fuente
De hecho, localhost resuelve a ambos 127.0.0.1y ::1. Intenté vincular MySQL a ::1, sin cambios. Incluso intenté vincular MySQL 0.0.0.0y ::, no hay diferencia.
Philipp Jardas
0

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

skip-name-resolve       = on

Cuando haces esto, MySQL lo usa por más tiempo rDNS para resolver 127.0.0.1-> localhosty, dado que todos mis correos electrónicos GRANTson para user@localhost, el usuario no puede conectarse desde el host 127.0.0.1.

Existen dos soluciones para este problema particular:

  1. Inhabilitar skip-name-resolve
  2. Expande tus correos GRANTelectrónicos para incluir 127.0.0.1ylocalhost
Christopher Schultz
fuente