การเชื่อมต่อระยะไกลไปยังเซิร์ฟเวอร์ MySQL ใช้เวลานานมาก


10

ฉันมีเซิร์ฟเวอร์ MySQL 5.0.75 ที่ทำงานบนโน้ตบุ๊ก Linux ซึ่งฉันต้องการเชื่อมต่อจากเครื่องอื่นในเครือข่ายท้องถิ่น

การเชื่อมต่อนี้ใช้เวลา 5-6 วินาที:

mysql -h 172.22.65.101 -u myuser -p123

ปิงไปยังโฮสต์ 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

ความคิดใด ๆ เมื่อฉันตรวจสอบการเชื่อมต่อกับ SHOW PROCESSLIST; บนโฮสต์ MySQL ฉันจะเห็นว่าคำสั่งคือ "เชื่อมต่อ" และผู้ใช้คือ "ผู้ใช้ที่ไม่ได้ตรวจสอบสิทธิ์" สิ่งนี้จะคงอยู่จนกว่าการเชื่อมต่อจะถูกสร้างขึ้น (ผู้ใช้จะปรากฏเป็น "myuser" และคำสั่งคือ "sleep")

ฉันเป็นนักพัฒนาซอฟต์แวร์และต้องการคำแนะนำของคุณเกี่ยวกับวิธีหาคอขวด!

my.cnf ของฉันบนโฮสต์:

[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

ลูกค้า:

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

เซิร์ฟเวอร์:

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

คำตอบ:


17

อาจเป็นเพราะคุณพยายามดึงและตรวจสอบ DNS ย้อนกลับของโฮสต์ที่เชื่อมต่ออยู่ คุณสามารถทดสอบนี้โดยการเปิดskip_name_resolveใน my.cnf เซิร์ฟเวอร์[mysqld]ส่วน

หากเป็นจริงในกรณี (แสดงโดยพารามิเตอร์ที่กำจัดความล่าช้า) จากนั้นคุณสามารถแก้ปัญหาโดยการตั้งค่า DNS อย่างถูกต้อง (ไปข้างหน้าและย้อนกลับ) สำหรับลูกค้าหรือทำงานด้วยskip_name_resolveตลอดเวลา (ซึ่งหมายความว่าคุณสามารถ ไม่ใช้ชื่อโฮสต์ในGRANTตารางของคุณ)


แก้ไขแล้ว! ฉันกำหนด skip_name_resolve ใน my.cnf ของโฮสต์ MySQL ของฉันเริ่ม MySQL ใหม่และปัญหาได้รับการแก้ไข ฉันเป็นหนี้คุณเบียร์ :)
Lennart

ยินดีที่จะให้บริการ :)
ความวุ่นวาย

1
ดีมากขอบคุณ! เพียงเพื่อให้ชัดเจนว่า (ในกรณีที่มีคนมายุ่งเหมือนฉัน) มันเป็นเพียง "skip_name_resolve" ในบรรทัดเดียวไม่ใช่ "skip_name_resolve = 1" หรืออะไรก็ตาม ... มิฉะนั้นบริการของคุณจะไม่เริ่ม!
James Crowley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.