Zdalne połączenie z serwerem MySQL trwa bardzo długo

10

Mam serwer MySQL 5.0.75 działający na moim notebooku z systemem Linux, z którym chcę się połączyć z innego komputera w sieci lokalnej.

To połączenie zajmuje 5-6 sekund:

mysql -h 172.22.65.101 -u myuser -p123

Ping do hosta 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

Jakieś pomysły? Kiedy monitoruję połączenie za pomocą SHOW PROCESSLIST; na hoście MySQL widzę, że polecenie to „połącz”, a użytkownik to „użytkownik nieuwierzytelniony”. Trwa do momentu nawiązania połączenia. (Użytkownik jest wtedy wyświetlany jako „mój użytkownik”, a polecenie to „uśpienie”)

Jestem programistą i potrzebuję twoich sugestii, jak znaleźć wąskie gardło!

My my.cnf na hoście:

[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

Klient:

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

Serwer:

mysql  Ver 14.12 Distrib 5.0.75, for debian-linux-gnu (i486) using readline 5.2
Lennart
źródło

Odpowiedzi:

17

Prawdopodobnie opóźniasz się przy próbie odzyskania i zweryfikowania wstecznego DNS hosta łączącego się. Możesz to przetestować, włączając sekcję skip_name_resolvemy.cnf serwera [mysqld].

Jeśli tak jest (co pokazuje ten parametr eliminujący opóźnienie), możesz rozwiązać problem, odpowiednio konfigurując DNS (do przodu i do tyłu) dla klienta, lub działając skip_name_resolvecały czas (co oznacza, że ​​możesz nie używaj nazw hostów w swoich GRANTtabelach).

chaos
źródło
To naprawiło! Zdefiniowałem skip_name_resolve w my.cnf mojego hosta MySQL, zrestartowałem MySQL i problem został rozwiązany. Jestem ci winien piwo. :)
Lennart
Cieszę się, że mogłem pomóc. :)
chaos
1
wielkie dzięki! tylko dla jasności (na wypadek, gdyby ktoś zadzierał jak ja), to po prostu „skip_name_resolve” w jednym wierszu, a nie „skip_name_resolve = 1” lub cokolwiek ... w przeciwnym razie twoja usługa się nie uruchomi!
James Crowley,