Eu tenho uma instalação bastante padrão do MySQL no Debian Wheezy ( apt-get install mysql-server mysql-client
) que já fiz com sucesso várias vezes antes.
Quando tento conectar via localhost
, tudo funciona. Mas conectar via 127.0.0.1
dá 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 conectar-me a partir de um aplicativo Java, obtenho erros semelhantes, embora 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.
Normalmente, recebo essa exceção quando o servidor MySQL fecha uma conexão inativa ou foi reiniciado. No entanto, isso agora acontece na inicialização do aplicativo quando o aplicativo tenta se conectar pela primeira vez.
Engraçado o suficiente este fez trabalho apenas algumas horas antes. Infelizmente, não me lembro de ter mudado nada no servidor. :-(
Para ser honesto, este post contém duas perguntas: Por que não consigo 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 de ligação ao servidor para 0.0.0.0
e ::
, sem sucesso.
O servidor suporta IPv6 e está 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 ::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
fornece muitas informações, mas mostra que a conexão é fechada 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.
localhost
para o soquete, mas usa rede. Como seria de esperar naturalmente ... Mas a pergunta original permanece.Respostas:
O culpado parecia ser
hosts.deny
ehosts.allow
que, por padrão, possui um modo de arquivo0x600
. O MySQL não pode lê-los para determinar se deseja permitir conexões. Mudei os modos de arquivo para0x644
e agora tudo está funcionando sem problemas. Ainda estou me perguntando por que o MySQL não registrou nenhum erro ...fonte
Esta questão é muito semelhante ao MySQL não pode se conectar via "localhost", apenas 127.0.0.1 . Como indicado aqui, você provavelmente configurou o MySQL para ouvir apenas o soquete da rede e não o soquete do sistema de arquivos.
fonte
Você pode ter o IPv6 ativado, o seu localhost muito possível resolve para o localhost do ipv6, que não está definido na sua configuração do mysql.
Você pode verificar isso vendo se 'host localhost' na linha de comando retorna :: 1, assim como 127.0.0.1. Nesse caso, você pode remover o mapeamento :: 1 ou reconfigurar o MySQL para escutar o endereço IPv6 :: 1, bem como 127.0.0.1
fonte
127.0.0.1
e::1
. Eu tentei ligar o MySQL::1
, sem alterações. Eu até tentei vincular o MySQL0.0.0.0
e::
, não faz diferença.Recentemente, quebrei uma instalação funcional em que a maioria dos clientes é baseada em Java. As ferramentas da CLI funcionariam, mas todos os clientes Java pararam completamente. No meu caso, o culpado era uma nova configuração que eu havia habilitado "para melhorar o desempenho":
Quando você faz isso, o MySQL usa mais o rDNS para resolver
127.0.0.1
->localhost
e, como todos os meusGRANT
s servemuser@localhost
, o usuário não tem permissão para se conectar a partir do host127.0.0.1
.Existem duas soluções para esse problema específico:
skip-name-resolve
GRANT
s para incluir127.0.0.1
e tambémlocalhost
fonte