MySQL连接慢通常源于TCP建连、认证协商或初始握手阶段耗时高;用tcpdump抓包可定位延迟环节:三次握手是否拖沓、服务端响应是否迟缓,或MySQL协议层(如初始化包、认证包)卡顿。

MySQL连接慢通常不是SQL执行慢,而是TCP建连、认证协商或初始握手阶段耗时高。用tcpdump抓包分析,关键在于定位延迟发生在哪一环:是三次握手拖沓?服务端响应迟缓?还是MySQL协议层(如初始化包、认证包)卡顿?下面分步骤说明如何抓包、过滤和判断。
明确目标端口并精准抓包
MySQL默认使用3306端口,抓包必须限定范围,避免干扰:
- 只抓本机与MySQL服务器的双向TCP交互:
sudo tcpdump -i any -nn -s0 -w mysql_slow.pcap 'port 3306 and (host 192.168.5.100)'(把192.168.5.100换成你的MySQL服务IP) - 加
-s0确保捕获完整数据包(避免截断MySQL协议内容);-nn跳过DNS和端口名解析,提速且防干扰;-w保存为pcap文件,方便后续用Wireshark或命令行深度分析。
观察三次握手是否正常
打开mysql_slow.pcap后,先看SYN/SYN-ACK/ACK是否连续、时间间隔是否合理:
- 客户端发SYN(Flags [S]),服务端应在毫秒级内回SYN-ACK(Flags [S.]);若延迟>100ms,检查服务端负载、防火墙或中间设备(如负载均衡)是否丢包或限速。
- 若SYN发出后长时间无响应,可能是MySQL进程未监听、端口被占用、iptables拦截,或网络路由不通。
- 用
tcpdump -r mysql_slow.pcap -nn | grep -E "(S\.|\.S|\.A)"快速筛选握手标志位,结合时间戳计算各步耗时。
聚焦MySQL协议层握手细节
TCP建连成功后,MySQL服务端会发初始握手包(含协议版本、线程ID、salt等),客户端再发登录认证包。慢就慢在这两步:
- 用
tcpdump -r mysql_slow.pcap -A -nn | grep -A5 -B5 "0a000000"查找MySQL协议头(0x0a是MySQL协议版本号,常见于初始包开头); - 若服务端发完初始包后,客户端隔几百毫秒才回认证包,说明客户端侧存在DNS反向解析(如
skip-name-resolve未启用)、本地密码插件兼容问题或应用连接池配置异常; - 若客户端迅速发了认证包,但服务端迟迟不返回OK/ERR包,重点查MySQL错误日志——常见原因包括:账户权限校验慢(尤其启用了PAM或LDAP)、大量并发连接触发
max_connections限制、或磁盘I/O阻塞导致用户表读取延迟。
排除DNS和系统级干扰
很多“连接慢”实际是DNS解析拖累,而tcpdump本身看不出这点,需配合验证:
- 抓包同时运行
tcpdump -i any -nn port 53,看是否有PTR查询(反向DNS);若有,且延迟高,确认MySQL服务端已配置skip-name-resolve=ON; - 检查客户端主机是否配置了慢DNS服务器,或
/etc/hosts中缺少MySQL服务IP映射; - 用
strace -e trace=connect,sendto,recvfrom -p $(pgrep -f "mysql -h")在客户端侧跟踪系统调用,确认阻塞点是否在connect()返回前(网络层)或connect()返回后(协议层)。


















