KILL [CONNECTION | QUERY] thread_id
-- CONNECTION (默認):斷開連接
-- QUERY:僅終止當前語句,保持連接
權限:PROCESS 可看所有線程,SUPER 可 Kill 所有線程。
-- 1. 生成 Kill 語句
SELECT CONCAT('KILL ', id, ';')
FROM information_schema.PROCESSLIST
WHERE USER = 'root' AND TIME > 60 -- 條件自定
INTO OUTFILE '/tmp/kill.sql';
-- 2. 執行
SOURCE /tmp/kill.sql;
優點:無外部依賴,可放入定時事件自動清理。
# Kill 所有連接
mysqladmin -uroot -p processlist | awk -F'|' '{print $2}' | xargs -n1 mysqladmin -uroot -p kill
# Kill 指定用戶 (如 mike)
mysqladmin -uroot -p processlist | awk -F'|' '$3=="Mike"{print $2}' | xargs -n1 mysqladmin -uroot -p kill
優點:適合腳本調用,無需登入 MySQL。
#!/bin/bash
for id in $(mysqladmin processlist | grep -i locked | awk '{print $1}'); do
mysqladmin kill ${id}
done
pt-kill(生產首選)# 安裝
yum install percona-toolkit # 或下載二進制
# 僅打印超過 60 秒的查詢
pt-kill --busy-time 60 --print
# 打印並 Kill
pt-kill --busy-time 60 --print --kill
# 更多條件
pt-kill --match-command Query --match-user app_user --victims all --interval 10 --run-time 3600 --daemonize
核心參數:
--busy-time N:運行超過 N 秒--match-command / --match-user / --match-db / --match-host:過濾維度--victims all/oldest/youngest:選擇殺誰--daemonize:後台守護進程模式持續清理| 方法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| SQL + OUTFILE | 臨時手動清理、定時事件 | 純 SQL,無工具依賴 | 需文件權限,無守護模式 |
| mysqladmin 管道 | 運維腳本、CI/CD 任務 | Shell 原生,易集成 | 解析輸出格式易受版本影響 |
| Shell 腳本 | 特定狀態(如 locked)清理 | 邏輯可控 | 需維護腳本 |
| pt-kill | **生產環境常態化治理** | 功能最全、守護進程、條件豐富、官方維護 | 需額外安裝 |
--busy-time 300 --kill --daemonize --log /var/log/pt-kill.logpt-query-digest)定位高頻慢 SQL,從源頭優化setQueryTimeout、PDO ATTR_TIMEOUT)雙重保障Kill 是止痛藥,優化才是治本方。建立「監控 → Kill 止血 → 分析 → 優化 → 驗證」閉環,才能從根上消除長查詢隱患。