需要批量終止特定使用者、長時間運行或鎖定的 MySQL 連線時,四種方法各有適用場景。
-- 1. 查看生成的 KILL 語句
SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user='root';
-- 2. 導出到檔案
SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';
-- 3. 執行
SOURCE /tmp/a.txt;
優點:可靈活過濾(user、db、time、state、info),可預覽再執行。
# 殺掉所有連線
mysqladmin -uroot -p processlist | awk -F "|" '{print $2}' | xargs -n 1 mysqladmin -uroot -p kill
# 殺掉指定使用者(如 Mike)
mysqladmin -uroot -p processlist | awk -F "|" '{if($3 == "Mike") print $2}' | xargs -n 1 mysqladmin -uroot -p kill
優點:無需登入 MySQL,適合自動化腳本;缺點:需輸入多次密碼(可配合 --password=xxx 或 .my.cnf)。
for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`
do
mysqladmin kill ${id}
done
可擴展:依據 Time、State、Info 等欄位過濾。
# 殺掉超過 60 秒的查詢 mk-kill --busy-time 60 --kill # 僅列印不殺(預覽) mk-kill --busy-time 60 --print # 列印並殺掉 mk-kill --busy-time 60 --print --kill
更多參數:官方文檔。
現代替代工具:pt-kill (Percona Toolkit),功能更豐富、維護更積極。
| 場景 | 推薦方法 |
|---|---|
| 需精細過濾、預覽 SQL | 方法一 |
| 自動化腳本、無交互 | 方法二 / pt-kill |
| 臨時手工清理鎖定連線 | 方法三 |
| 生產環境常態化治理(長查詢、閒置、特定用戶) | pt-kill 守護進程模式 |
警示:批量 KILL 可能導致事務回滾、應用報錯,務必在低峰期或配合應用熔斷機制執行。