首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

tcpdump 抓取 MySQL 流量實戰:一條命令診斷 SQL 執行細節

     編輯:MySQL 資料庫相關知識

前言:為什麼要抓包分析 MySQL?

當應用報「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 或實際介面名
輸出亂碼、看不出 SQLMySQL 協議為二進制,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 雙向抓取

進階:Wireshark 深度分析

  1. 抓包存檔:tcpdump -i eth0 -s 0 -w /tmp/mysql.pcap port 3306
  2. 下載到本機,用 Wireshark 開啟。
  3. 過濾器輸入 mysql,自動解析協議欄位:
    Command Query、Response、Error、Prepare Statement、Execute Statement 等。
  4. 右鍵某查詢 → Follow TCP Stream 可見完整 SQL 文本與回應。

生產環境注意事項

  • 磁碟 IO:高併發下 -w 寫檔會佔用大量 IO,建議抓取短時間(如 30 秒)或用 ring buffer 模式 -W 5 -C 100(5 個 100MB 檔案循環)。
  • CPU:strings 管道較輕量,但高流量下仍消耗 CPU,可改用 tshark -Y mysql -T fields -e mysql.query 直接解析。
  • 權限:需 root 或 CAP_NET_RAW 權限。
  • 合規:抓包可能捕獲敏感資料(密碼、個資),操作後立即刪除 pcap,嚴禁外洩。

熟練 tcpdump + Wireshark 分析 MySQL 流量,是 DBA 與後端工程師排查「黑盒」資料庫行為的核心技能之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved