面對大量阻塞連線,手工 KILL 不現實。本文提供 4 種批量終止方案:information_schema 生成腳本、mysqladmin 管道、Shell 迴圈、Maatkit mk-kill 專業工具。
KILL [CONNECTION | QUERY] thread_id -- CONNECTION:斷開連線(預設) -- QUERY:僅終止當前語句,保持連線
需 PROCESS 權限查看所有線程,SUPER 權限殺掉所有線程。
-- 1. 生成 KILL 語句至檔案
SELECT CONCAT('KILL ', id, ';')
FROM information_schema.processlist
WHERE user = 'root' AND time > 60
INTO OUTFILE '/tmp/kill_list.sql';
-- 2. 執行腳本
SOURCE /tmp/kill_list.sql;
# 殺掉所有連線
mysqladmin -uroot -p processlist | awk -F'|' '{print $2}' | xargs -n1 mysqladmin -uroot -p kill
# 殺掉指定用戶
mysqladmin -uroot -p processlist | awk -F'|' '$3=="Mike"{print $2}' | xargs -n1 mysqladmin -uroot -p kill
for id in $(mysqladmin processlist | grep -i locked | awk '{print $1}'); do
mysqladmin kill ${id}
done
# 僅預覽超過 60 秒的查詢 mk-kill --busy-time 60 --print # 直接殺掉並輸出 mk-kill --busy-time 60 --print --kill # 更多條件:--match-command, --match-user, --victims (all/oldest/youngest) 等
官網:mk-kill 文檔
KILL 只是打標記,線程在特定檢查點(讀取行、刷盤等)才真正退出。REPAIR TABLE/OPTIMIZE TABLE 會導致 MyISAM 表損壞,**極度謹慎**。KILL QUERY 不會自動回滾,需應用層處理。