SELECT
SUBSTRING_INDEX(host, ':', 1) AS client_ip,
COUNT(*) AS connection_count,
GROUP_CONCAT(DISTINCT user) AS users,
GROUP_CONCAT(DISTINCT db) AS databases
FROM information_schema.processlist
WHERE command != 'Sleep' -- 可選:過濾空閒連線
GROUP BY client_ip
ORDER BY connection_count DESC;
優點:無需 Shell 權限、可直接嵌入監控系統、支援聚合分析。
mysql -u root -h127.0.0.1 -e "SHOW PROCESSLIST\G" \
| grep -E '^ *Host:' \
| awk -F': ' '{print $2}' \
| awk -F':' '{print $1}' \
| sort | uniq -c | sort -nr
輸出範例:
45 10.0.1.10
12 10.0.1.11
3 10.0.1.12
mysql -u root -h127.0.0.1 --skip-column-names -e "SHOW PROCESSLIST" \
| awk '{print $3}' \
| awk -F':' '{print $1}' \
| sort | uniq -c
#!/bin/bash
# monitor_connections.sh - 每分鐘執行,寫入時序資料庫
MYSQL_CMD="mysql -u monitor -p'xxxx' -h127.0.0.1 --skip-column-names"
TS=$(date +%s)
$MYSQL_CMD -e "SHOW PROCESSLIST" | awk '{print $3}' | awk -F':' '{print $1}' | sort | uniq -c | while read cnt ip; do
echo "mysql_connections{ip=\"$ip\"} $cnt $TS" | curl --data-binary @- https://pushgateway:9091/metrics/job/mysql
done
| 指標 | 閾值 | 動作 |
|---|---|---|
| 單 IP 連線數 | > 200 | 告警 + 限流/封禁 |
| 總連線數 | > max_connections * 0.8 | 擴容/優化慢查詢 |
| Sleep 連線佔比 | > 50% | 檢查連線池配置、啟用 wait_timeout |
「SQL 聚合分析、Shell 快速排查、腳本持久化監控」三層組合,全方位掌握 MySQL 客戶端連線 IP 分布。生產環境建議接入 Prometheus + Grafana,建立連線數儀表板與自動告警。