當應用報「SQL 執行慢」但慢查詢日誌無記錄、或懷疑連線池洩漏、或需審計傳輸明文密碼時,tcpdump 抓取 3306 端口流量是最直接、零侵入的診斷手段。本文給出生產可用的單行命令與常見坑點。
tcpdump -s 0 -l -w - dst 192.168.244.10 and port 3306 -i eno16777736 | strings
參數解析:
-s 0:抓取完整封包(預設 262144 位元組,0 表不截斷)。-l:行緩衝,配合管道即時輸出。-w -:寫入標準輸出(而非檔案),供 strings 過濾可見字元。dst 192.168.244.10 and port 3306:只抓目標 MySQL 伺服器入向流量(客戶端→Server),減少雜訊。-i eno16777736:指定網卡介面。RHEL/CentOS 7+ 預設介面名不再是 eth0,用 ip link 確認。| strings:過濾二進制協議中的可見字串(SQL 文本、錯誤訊息、用戶名),人眼可讀。| 現象 | 原因 | 解決 |
|---|---|---|
tcpdump: Bluetooth link-layer type filtering not implemented | 未指定 -i,預設抓到藍牙介面 | 加上 -i eth0 或實際介面名 |
| 輸出亂碼、看不出 SQL | MySQL 協議為二進制,strings 只能見明文部分 | 改用 tcpdump -X -s 0 -i eth0 port 3306 -w mysql.pcap 存檔,用 Wireshark 解析 MySQL 協議 |
| SSL 加密連線,全是亂碼 | 啟用 REQUIRE SSL 或 --ssl-mode=REQUIRED | 臨時關閉客戶端 SSL 抓包,或配置 Wireshark 載入 Server 私鑰解密(需 PFS 為 RSA) |
| 抓不到回應封包 | 只抓 dst 方向 | 去掉 dst 或改 host 192.168.244.10 雙向抓取 |
tcpdump -i eth0 -s 0 -w /tmp/mysql.pcap port 3306mysql,自動解析協議欄位:Command Query、Response、Error、Prepare Statement、Execute Statement 等。Follow TCP Stream 可見完整 SQL 文本與回應。-w 寫檔會佔用大量 IO,建議抓取短時間(如 30 秒)或用 ring buffer 模式 -W 5 -C 100(5 個 100MB 檔案循環)。strings 管道較輕量,但高流量下仍消耗 CPU,可改用 tshark -Y mysql -T fields -e mysql.query 直接解析。CAP_NET_RAW 權限。熟練 tcpdump + Wireshark 分析 MySQL 流量,是 DBA 與後端工程師排查「黑盒」資料庫行為的核心技能之一。