生產環境常需統計「哪個應用服務器連接數最多」,而非總連接數。本文提供 3 種從信息庫、命令行、腳本維度獲取 IP 級連接統計的方案。
SELECT
SUBSTRING_INDEX(host, ':', 1) AS client_ip,
COUNT(*) AS connection_count
FROM information_schema.processlist
GROUP BY client_ip
ORDER BY connection_count DESC;
輸出示例:
+-------------+------------------+
| client_ip | connection_count |
+-------------+------------------+
| 10.0.1.5 | 42 |
| 10.0.1.8 | 38 |
| 10.0.2.12 | 15 |
| 127.0.0.1 | 3 |
+-------------+------------------+
優點:無需額外工具、可直接嵌入監控系統(Prometheus mysqld_exporter 自定義查詢)。
注意:host 格式為 ip:port,SUBSTRING_INDEX(host, ':', 1) 取 IP;若啟用 skip-name-resolve 顯示 IP,否則顯示主機名需額外解析。
mysql -u root -h127.0.0.1 -p -e "SHOW PROCESSLIST\G" \
| grep "Host:" \
| awk -F': ' '{print $2}' \
| awk -F':' '{print $1}' \
| sort | uniq -c | sort -nr
解析:
SHOW PROCESSLIST\G 垂直顯示,每行一字段。grep "Host:" 過濾 Host 行。awk -F': ' '{print $2}' 取冒號後值(含端口)。awk -F':' '{print $1}' 截取 IP。sort | uniq -c | sort -nr 統計並降序。
mysql -u root -h127.0.0.1 --skip-column-names -p -e "SHOW PROCESSLIST;" \
| awk '{print $3}' \
| awk -F':' '{print $1}' \
| sort | uniq -c | sort -nr
--skip-column-names 去除表頭,$3 直接取 Host 列(表格模式第 3 列)。
| 維度 | 方法一 | 方法二 | 方法三 |
|---|---|---|---|
| 數據源 | information_schema | SHOW PROCESSLIST\G | SHOW PROCESSLIST |
| 適合場景 | 監控系統采集、報表查詢 | 運維手工排查、臨時統計 | 快速單次統計 |
| 權限需求 | PROCESS 或 SELECT ON information_schema | PROCESS | PROCESS |
| 解析準確度 | 高(標準表) | 高 | 高 |
| 自動化友好 | ★★★★★ | ★★☆☆☆ | ★★★☆☆ |
#!/bin/bash
# monitor_connections.sh
while true; do
echo "=== $(date '+%F %T') ==="
mysql -u root -h127.0.0.1 -p'password' -N -e \
"SELECT SUBSTRING_INDEX(host,':',1) ip, COUNT(*) cnt FROM information_schema.processlist GROUP BY ip ORDER BY cnt DESC;"
sleep 10
done
配合 watch -n 10 或納入 Zabbix/Prometheus/Grafana 實現可視化告警。
skip-name-resolve=1(my.cnf [mysqld]),避免 DNS 解析延遲且直接見 IP。Host 列為 localhostlocalhost,統計時可歸類為 127.0.0.1。
maxPoolSize)、是否未正確關閉連接、是否遭遇慢查詢堆積導致連接佔用不釋放。掌握這 3 種方法,從「總連接數」進化到「IP 級連接畫像」,快速定佔用大戶、預防連接耗盡事故。