A conexão remota ao servidor MySQL leva muito tempo

10

Eu tenho um servidor MySQL 5.0.75 em execução no meu notebook Linux, ao qual quero me conectar de outra máquina na rede local.

Essa conexão leva de 5 a 6 segundos:

mysql -h 172.22.65.101 -u myuser -p123

Um ping para o host MySQL:

PING 172.22.65.101 (172.22.65.101) 56(84) bytes of data.
64 bytes from 172.22.65.101: icmp_seq=1 ttl=64 time=0.799 ms
64 bytes from 172.22.65.101: icmp_seq=2 ttl=64 time=0.000 ms
64 bytes from 172.22.65.101: icmp_seq=3 ttl=64 time=6.43 ms
64 bytes from 172.22.65.101: icmp_seq=4 ttl=64 time=0.000 ms
64 bytes from 172.22.65.101: icmp_seq=5 ttl=64 time=3.81 ms
64 bytes from 172.22.65.101: icmp_seq=6 ttl=64 time=0.706 ms
^C
--- 172.22.65.101 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5027ms
rtt min/avg/max/mdev = 0.000/1.959/6.437/2.383 ms

Alguma ideia? Quando monitoro a conexão com SHOW PROCESSLIST; no host do MySQL, posso ver que o comando é "conectar" e o usuário é "usuário não autenticado". Isso dura até que a conexão seja estabelecida. (O usuário é exibido como "myuser" e o comando é "sleep")

Sou desenvolvedor e preciso de suas sugestões sobre como encontrar o gargalo!

Meu my.cnf no host:

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice  = 0

[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
myisam-recover = BACKUP
query_cache_limit = 1M
query_cache_size = 16M
expire_logs_days = 10
max_binlog_size = 100M
skip-federated

[mysqldump]
quick
quote-names
max_allowed_packet = 16M

[isamchk]
key_buffer = 16M

Cliente:

mysql  Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2

Servidor:

mysql  Ver 14.12 Distrib 5.0.75, for debian-linux-gnu (i486) using readline 5.2
Lennart
fonte

Respostas:

17

Provavelmente, você está com uma tentativa de recuperar e verificar o DNS reverso do host de conexão. Você pode testar isso ativando skip_name_resolvea [mysqld]seção my.cnf do servidor .

Se esse for realmente o caso (demonstrado por esse parâmetro eliminando o atraso), você poderá resolver o problema configurando o DNS adequadamente (encaminhar e reverter) para o cliente ou executando skip_name_resolveo tempo todo (o que significa que você pode use nomes de host em suas GRANTtabelas).

caos
fonte
Isso consertou! Eu defini skip_name_resolve no my.cnf do meu host MySQL, reiniciei o MySQL e o problema foi resolvido. Te devo uma cerveja. :)
Lennart
Fico feliz em estar de serviço. :)
caos
1
ótimo obrigado! só para ficar claro (no caso de alguém estragar como eu), é simplesmente "skip_name_resolve" em uma linha, não "skip_name_resolve = 1" ou qualquer outra coisa ... caso contrário, seu serviço não será iniciado!
James Crowley