兩種呼叫方式
# 方式 1:命令列(無需登入 mysql shell)
mysqladmin processlist
# 方式 2:SQL 介面(支援 WHERE 過濾)
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST; -- 顯示完整 SQL 文本
輸出欄位詳細解讀
| 欄位 | 含義 | 排查價值 |
Id | 連線執行緒 ID | KILL <Id> 終止會話 |
User | MySQL 用戶名 | 識別應用/帳號 |
Host | 客戶端 IP:Port | 追蹤來源機器 |
db | 當前預設資料庫 | 定位業務庫 |
Command | 執行命令類型 | Sleep/Query/Connect/Binlog Dump... |
Time | 當前狀態持續秒數 | 長時間 = 疑似阻塞/慢查詢 |
State | SQL 執行內部狀態 | 關鍵診斷欄位(見下表) |
Info | 正在執行的 SQL 文本 | 直接看到問題語句 |
常見 State 狀態含義速查
| State | 含義 | 典型原因 |
Sleep | 閒置等待新請求 | 連線池未釋放、長連線 |
Locked | 等待表鎖 | MyISAM 表鎖、FLUSH TABLES、DDL |
Sending data | 讀取並發送結果 | 大結果集、無索引掃描 |
Copying to tmp table | 建立臨時表 | GROUP BY/ORDER BY/DISTINCT 無索引 |
Sorting result | 排序中 | ORDER BY 無索引、sort_buffer 不足 |
Waiting for table metadata lock | 等待 MDL | DDL 與 DML 衝突、長事務 |
Updating | 執行 UPDATE/DELETE | 大批量寫入、鎖等待 |
實戰排查腳本
-- 1. 找出執行超過 10 秒的活躍查詢
SELECT * FROM information_schema.PROCESSLIST
WHERE COMMAND != 'Sleep' AND TIME > 10
ORDER BY TIME DESC;
-- 2. 統計各狀態連線數
SELECT STATE, COUNT(*) FROM information_schema.PROCESSLIST GROUP BY STATE;
-- 3. 結合 KILL 批量釋放(謹慎使用)
SELECT CONCAT('KILL ', ID, ';') FROM information_schema.PROCESSLIST
WHERE USER = 'app_user' AND COMMAND = 'Sleep' AND TIME > 600;
權限說明
PROCESS 權限:查看所有線程(含他人)
- 無
PROCESS:僅見自己的線程
SUPER 權限:可 KILL 任意線程
進階替代方案
- Performance Schema:
events_statements_current 表提供更豐富的指標(鎖等待、IO、階段耗時)
- sys schema:
sys.session, sys.processlist 視圖封裝常用分析
- pt-query-digest:分析慢查詢日誌,聚合 TOP SQL