原文檔參見:show processlist 官方文檔
show processlist 命令返回的數據會展示給你正在運行的進程。你也可以從INFOMATION_SCHEMA的processlist表中獲取這些數據,還可以通過mysqldadmin processlist命令行獲取。如果你有進程權限,則可以查看所有的進程。否則你只能看你自己的進程(意思就是,只能看到和你登錄mysql賬戶相關的進程)。如果沒有使用full關鍵字,只會返回前100條進程信息。
進程信息也可以通過performance_schema的threads表獲取。但是訪問threads表不需要一個互斥鎖,對服務器的印象也會很小。通過information.processlist和show processlist 會差生負面的性能影響,因爲他們需要一個互斥鎖。threads表還會展示一些後臺進程的信息,而另外兩種方式沒有。這就一位置threads表可以用來監控其他信息源不能監控的活動。
show processlist 語句非常用用,如果你發現“too many connections”錯誤信息,並且想查明正在進行的線程,MySQL保留一個額外的連接,供具有超級特權的賬戶使用,以確保管理員始終能夠連接和檢查系統(假設您沒有將此特權授予所有用戶)。
線程可以使用kill語句被殺死。
下面是一些show processlist的顯示例子。
mysql> SHOW FULL PROCESSLIST\G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 1030455
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 1004
State: Has read all relay log; waiting for the slave
I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 3112
User: replikator
Host: artemis:2204
db: NULL
Command: Binlog Dump
Time: 2144
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 4. row ***************************
Id: 3113
User: replikator
Host: iconnect2:45781
db: NULL
Command: Binlog Dump
Time: 2086
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 5. row ***************************
Id: 3123
User: stefan
Host: localhost
db: apollon
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
5 rows in set (0.00 sec)
show processlist返回的列有以下含義
Id
連接的唯一標識符。這個值和information_schema.processlist表中的ID,threads表中的processlist_id,connection_id()函數返回值是一樣的。可以通過kill Id刪除這個連接進程。User 執行語句的mysql用戶。如果這是系統用戶,它指的是由服務器產生的非客戶端線程來處理內部任務。這可能是用於從庫複製或延遲行處理程序的輸入/輸出或SQL線程。未經身份驗證的用戶指的是與客戶端連接相關聯的線程,但是客戶端用戶的身份驗證尚未完成。events_cheduler是指監視預定事件的線程。對於系統用戶,主機列中沒有指定主機。
Host
發出語句的客戶端名稱(除了沒有主機的系統用戶之外)。SHOW PROCESSLIST報告主機名的主機名:client:port格式,以便更容易地確定哪個客戶端正在做什麼。- db 執行sql的數據庫
Command
正在執行線程命令的類型,本文主要詳解這個信息。Time 線程已經在當前狀態下的時間,單位爲S。
State 一種表示線程正在做什麼的動作、事件或狀態。大多數狀態對應於非常快速的操作。如果一個線程在一個給定的狀態下停留了許多秒,那麼可能會有一個問題需要被調查。對於 show processlist這個語句來說,狀態爲null。
Info 線程正在運行的sql語句,或者什麼也沒有運行的話則爲null。sql語句可能是發送到服務器的那個語句,或者是一個最內部的語句,如果語句執行其他語句。比如比如調用一個調用select語句的存儲過程,info的值爲爲這個select語句。
下面對command的各種值做一個解釋:
command值 | 解釋 |
Binlog Dump | 這是主服務器上的一個線程,用於向從屬服務器發送二進制日誌內容。 |
Change user | 線程正在執行一個變更用戶操作。 |
Close stmt | 線程正在關閉一個準備好的語句。 |
Connect | 一個複製從屬mysql連接上了他的主數據庫 |
Connect Out | 一個複製從屬mysql正在連接他的主數據庫 |
Create DB | 線程在執行一個建數據庫操作 |
Daemon | 這個線程是服務器內部的,而不是服務於客戶端連接的線程。 |
Debug | 線程正在生成調試信息。 |
Delayed insert | 線程是一個延遲插入處理程序。 |
Drop DB | 線程在執行刪庫操作 |
Error | 線程發生錯誤 |
Execute | 線程正在執行一個準備好的語句。 |
Fetch | 線程正在從執行準備好的語句中獲取結果。 |
Field List | 線程正在檢索表列的信息。 |
Init DB | 線程正在選擇一個默認數據庫。 |
Kill | 這個線程正在殺死另一個線程。 |
Long Data | 線程在執行準備好的語句的結果中檢索長數據。 |
Ping | 線程正在處理一個服務器ping請求。 |
Prepare | 線程正在準備一個準備好的語句。 |
Processlist | 線程正在生成關於服務器線程的信息 |
Query | 線程正在執行一條語句。 |
Quit | 線程終止。 |
Refresh | 線程在刷新表、日誌或緩存,或者重置狀態變量或複製服務器信息。 |
Register Slave | 線程正在註冊一個從屬服務器。 |
Reset stmt | 線程正在重置準備好的語句。 |
Set option | 線程正在設定或重置客戶端狀態執行選項。 |
shutdown | 線程正在關閉服務器。 |
Sleep | 線程正在等待客戶端向它發送一個新的語句。 |
Statistics | 線程正在生成服務器狀態信息。 |
Table Dump | 線程正在向從屬服務器發送表內容。 |
Time | 從未用過 |
下面對status關鍵字做一個簡介:
下面的列表描述了與一般查詢處理相關聯的線程狀態值,像主從複製這樣的更專業的活動非。其中許多功能只適用於在服務器中查找bug。
state值 | 解釋 |
After create | 當線程創建一個表(包括內部臨時表)時,就會發生這種情況,在創建表的函數的末尾處。即使由於某些錯誤而不能創建表,也會使用這個狀態。 |
Analyzing | 線程正在計算MyISAM表鍵的分佈(例如,用於分析表) |
checking permissions | 線程正在檢查服務器是否擁有執行語句所需的特權。 |
Checking table | 線程正在執行一個表格檢查操作。 |
cleaning up | 線程已經處理了一個命令,並且正在準備釋放內存和重置某些狀態變量。 |
closing tables | 線程將更改的表數據刷新到磁盤,並關閉已使用的表。這應該是一個快速的操作。如果沒有,請確認您沒有一個完整的磁盤,並且磁盤沒有很重的使用。 |
converting HEAP to ondisk | 線程正在將一個內部臨時表從一個存儲器錶轉換成一個磁盤表。 |
copy to tmp table | 線程正在處理ALTER TABLE語句。這個狀態發生在表之後,新的結構已經被創建,但是在行被複制到表之前。 對於處於這個狀態的線程來說,Performance Schema可以用來獲得複製操作的進度。 |
Copying to group table | 如果一個語句按照標準按不同的順序排列,那麼各行將按組排序並複製到一個臨時表中。 |
Copying to tmp table | 服務器正在複製到內存中的臨時表。 |
altering table | 服務器正在執行一個原位的ALTER TABLE。 |
Copying to tmp table on disk | 服務器正在複製到磁盤上的臨時表。臨時結果集變得太大了。因此,線程正在將臨時表從內存中更改爲基於磁盤的格式,以節省內存。 |
Creating index | 線程正在處理ALTER TABLE……啓用MyISAM表的鍵。 |
Creating sort index | 線程正在處理使用內部臨時表解析的SELECT。 |
creating table | 線程正在創建一個表。這包括創建臨時表。 |
| 線程正在內存或磁盤上創建一個臨時表。如果表是在內存中創建的,但是後來被轉換成一個磁盤表,那麼該操作期間的狀態將會複製到磁盤上的tmp表。 |
committing alter table to storage engine | 服務器已經完成了一個就地修改表,並正在提交結果。 |
deleting from main table | 服務器正在執行一個多表刪除的第一部分。它只從第一個表中刪除,並保存列和偏移量,以便從其他(參考)表中刪除。 |
deleting from reference tables | 服務器正在執行多表刪除的第二部分,並從其他表中刪除匹配的行。 |
discard_or_import_tablespace | 線程正在處理一個ALTER TABLE……丟棄表空間或ALTER TABLE……導入表空間中。 |
end | 這發生在最後,但是在ALTER TABLE,創建視圖、刪除、插入、選擇或更新語句清理之前。 |
executing | 線程已經開始執行一個語句。 |
Execution of init_command | 線程在init_command系統變量的值中執行語句。 |
| 線程已經執行了一個命令。在這個狀態下完成的一些物品的釋放涉及到查詢緩存。通常情況下,這個狀態會被清理 |
FULLTEXT initialization | 服務器正準備執行自然語言全文搜索。 |
init | 這發生在ALTER TABLE的初始化之前,刪除,插入,選擇,或更新語句。服務器在這個狀態下所採取的操作包括沖洗二進制日誌、InnoDB日誌和一些查詢緩存清理操作。對於end狀態,以下操作可能會發生: 1.在表格中的數據被更改後刪除查詢緩存條目 2.將事件寫入二進制日誌 3.釋放內存緩衝區,包括blob |
Killed | 有人給線程發送了一個KILL語句,它應該在下一次檢查KILL標誌時終止。在MySQL的每個主要循環中都要檢查國旗,但在某些情況下,線程可能需要很短的時間才能死。如果線程被其他線程鎖定,那麼當其他線程釋放鎖時,kill就會生效。 |
logging slow query | 線程正在爲慢查詢日誌寫一個語句。 |
login | 連接線程的初始狀態,直到客戶端成功驗證爲止。 |
manage keys | 服務器啓用或禁用表索引。 |
NULL | z這個狀態被用於SHOW PROCESSLIST狀態。 |
opening tables | 線程正在嘗試打開一個表。這應該是非常快的過程,除非有什麼東西阻止打開。例如,ALTER TABLE或鎖表語句可以防止在語句完成之前打開表。同樣需要檢查的是,您的table_open_cache值足夠大。 |
optimizing | 服務器正在爲一個查詢執行初始優化 |
preparing | 這種狀態發生在查詢優化期間 |
Purging old relay logs | 線程正在刪除不需要的中繼日誌文件 |
query end | 這個狀態發生在處理一個查詢之後,但是在釋放項狀態之前。 |
Receiving from client | 服務器正在讀取客戶端的數據包。這個狀態被稱爲在MySQL 5.7.8之前的網絡讀取。 |
Removing duplicates | 該查詢使用SELECT截然不同的方式,MySQL無法在早期階段優化不同的操作。因此,MySQL需要一個額外的階段來刪除所有重複的行,然後將結果發送給客戶端。 |
removing tmp table | 線程在處理一個SELECT語句後刪除一個內部臨時表。如果沒有創建臨時表,則不使用此狀態 |
rename | 線程正在重命名一個表。 |
rename result table | 線程正在處理ALTER TABLE語句,創建了新表,並重新命名它來替換原來的表 |
Reopen tables | 線程爲表獲得了一個鎖,但是在獲得了底層表結構更改後的鎖之後才注意到。它釋放了鎖,關閉了表,並試圖重新打開它 |
Repair by sorting | 修復代碼使用某種類型來創建索引。 |
preparing for alter table | 服務器正在準備執行一個就地修改表。 |
Repair done | 線程已經完成了一個MyISAM表的多線程修復。 |
Repair with keycache | 修復代碼使用一個接一個地通過密鑰緩存創建密鑰。這比通過排序要慢得多。 |
Rolling back | 線程正在回滾事務。 |
Saving state | 對於MyISAM表操作,如修復或分析,線程正在將新表狀態保存到.MYI文件頭。狀態包含諸如行數、自動遞增計數器和鍵分佈等信息 |
Searching rows for update | 線程正在做第一個階段,在更新它們之前找到所有匹配的行。如果更新正在改變用於查找所涉及行的索引,那麼就必須這樣做 |
Sending data | 線程正在讀取和處理SELECT語句的行,並將數據發送給客戶機。因爲在這個狀態中發生的操作傾向於執行大量的磁盤訪問(讀取),所以它通常是給定查詢的生命週期中最長的運行狀態。 |
Sending to client | 服務器正在給客戶端寫一個數據包。 |
setup | 線程正在開始一個ALTER TABLE操作。 |
Sorting for group | 線程在做一個排序去優化group by操作 |
Sorting for order | 線程在做一個排序去優化order操作 |
Sorting index | 在MyISAM表優化操作期間,線程正在對索引頁進行排序,以獲得更高效的訪問。 |
Sorting result | 對於SELECT語句,這類似於創建排序索引,但只是對於非臨時表來說。 |
statistics | 服務器正在計算統計信息以開發一個查詢執行計劃。如果一個線程在這個狀態中存在很長一段時間,那麼服務器可能會執行其他工作。 |
System lock | 線程已經調用了mysql_lock_tables(),並且線程狀態還沒有被更新。這是一個非常普遍的狀態,可能有很多原因。例如,線程將請求或正在等待表的內部或外部系統鎖定。當InnoDB在執行鎖表時等待表級鎖時,就會發生這種情況。如果這個狀態是由外部鎖的請求引起的,並且您沒有使用多個mysqld服務器訪問相同的MyISAM表,那麼您可以使用-skip-external鎖定選項禁用外部系統鎖。然而,外部鎖定在缺省情況下是禁用的,因此該選項很可能不會產生任何影響。對於SHOW PROFILE,這個狀態意味着螺紋請求鎖(而不是等待它)。 |
update | 線程正在準備開始更新表。 |
Updating | 線程正在搜索要更新的行,並正在更新它們。 |
updating main table | 服務器正在執行多表更新的第一部分。它只更新第一張表,並保存列和偏移量,用於更新其他(參考)表。 |
updating reference tables | 服務器正在執行一個多表更新的第二部分,並更新來自其他表的匹配行。 |
User lock | 線程會請求或正在等待一個帶有getlock()調用的諮詢鎖。對於SHOW PROFILE,這個狀態意味着線程請求鎖(而不是等待它)。 |
User sleep | 線程調用了SLEEP()調用。 |
Waiting for commit lock | FLUSH TABLES WITH READ LOCK 等待一個提交鎖 |
Waiting for global read lock | FLUSH TABLES WITH READ LOCK 正在等待全局讀鎖,或者正在設置全局readonly系統變量。 |
| 該線程得到了一個通知,表明表的底層結構已經發生了變化,它需要重新打開表來獲得新的結構。但是,要重新打開表,它必須等到所有其他線程都關閉了這個表。 如果另一個線程使用了刷新表或下面的表中的一個語句:刷新表tblname、ALTER TABLE、RENAME表、修理表、分析表或優化表,則會發出通知。 |
Waiting for table flush | 線程正在執行沖刷的表,並等待所有線程關閉它們的表,或者線程得到通知,表的底層結構發生了變化,它需要重新打開表格以獲得新的結構。但是,要重新打開表,它必須等到所有其他線程都關閉了這個表。 如果另一個線程使用了沖刷表或下面的表中的一個語句:刷新表tblname、ALTER TABLE、RENAME表、修理表、分析表或優化表,則會發出通知。 |
Waiting for lock_type lock | 服務器正在等待從元數據鎖定子系統獲得一個THR_LOCL鎖或鎖,其中locktype表示鎖的類型。 這個狀態表示等待一個THR_LOCK鎖: Waiting for table level lock 這些狀態表示等待元數據鎖:
|