A conexão do MySQL funciona com o localhost, mas não com o 127.0.0.1

7

Eu tenho uma instalação bastante padrão do MySQL no Debian Wheezy ( apt-get install mysql-server mysql-client ) que eu fiz com sucesso muitas vezes antes.

Quando tento me conectar via localhost , tudo funciona. Mas a conexão via 127.0.0.1 fornece uma mensagem de erro:

$ 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

Quando tento me conectar de um aplicativo Java, recebo erros semelhantes, embora eu esteja usando localhost como o nome do 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.

Eu normalmente recebo esta exceção quando o servidor MySQL fechou uma conexão ociosa ou foi reiniciado. No entanto, isso acontece agora na inicialização do aplicativo quando o aplicativo tenta se conectar pela primeira vez.

Engraçado que isso funcionou poucas horas antes. Infelizmente não me lembro de ter mudado nada no servidor. : - (

Então, para ser honesto, este post contém duas perguntas: Por que não consigo me conectar via 127.0.0.1 ? E por que meus aplicativos não podem se conectar via localhost , embora eu possa 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"

EDITAR

Eu tentei vincular o servidor a 0.0.0.0 e :: , sem sucesso.

O servidor suporta o IPv6 e é configurado de acordo:

# host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1

O mesmo problema descrito acima acontece quando tento me conectar a ::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

A conexão via telnet não fornece muitas informações, mas mostra que a conexão foi encerrada imediatamente.

# telnet localhost 3306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

A propósito, os arquivos de log do MySQL são totalmente silenciosos mesmo com o log ativado.

    
por Philipp Jardas 22.07.2014 / 09:14

4 respostas

1

O culpado parecia ser hosts.deny e hosts.allow , que por padrão tem um modo de arquivo de 0x600 . O MySQL não pôde lê-los para determinar se permitir conexões. Alterei os modos de arquivo para 0x644 e agora tudo está funcionando perfeitamente. Ainda estou me perguntando por que o MySQL não registrou nenhum erro ...

    
por 22.07.2014 / 10:17
0

Esta pergunta é muito semelhante a O MySQL não pode se conectar via "localhost", apenas 127.0.0.1 . Como afirmamos aqui, você provavelmente configurou o MySQL para escutar apenas o soquete da rede e não para o soquete do sistema de arquivos.

    
por 22.07.2014 / 09:51
0

Você pode ter o IPv6 ativado, seu próprio localhost é resolvido para o localhost ipv6, que não está definido em sua configuração do mysql.

Você pode verificar isso verificando se 'host localhost' na linha de comando retorna :: 1, assim como 127.0.0.1. Se assim for, você pode remover o mapeamento :: 1 ou reconfigurar o MySQL para escutar no endereço IPv6 :: 1, bem como 127.0.0.1

    
por 22.07.2014 / 10:05
0

Eu recentemente quebrei uma instalação de trabalho onde a maioria dos clientes é baseada em Java. As ferramentas CLI funcionariam, mas os clientes Java pararam completamente em suas trilhas. No meu caso, o culpado foi uma nova configuração que eu tinha permitido "melhorar o desempenho":

skip-name-resolve       = on

Quando você faz isso, o MySQL usa mais o rDNS para resolver 127.0.0.1 - > localhost e, como todos os meus GRANT s são para user@localhost , o usuário não tem permissão para se conectar a partir do host 127.0.0.1 .

Existem duas soluções para esse problema específico:

  1. Desativar skip-name-resolve
  2. Expanda seu GRANT s para incluir 127.0.0.1 , bem como localhost
por 18.04.2017 / 22:37

Tags