show processlist 語法(翻譯自mysql5.7參考文檔)

原文檔參見: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線程正在創建一個表。這包括創建臨時表。

Creating tmp 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系統變量的值中執行語句。

freeing items

線程已經執行了一個命令。在這個狀態下完成的一些物品的釋放涉及到查詢緩存。通常情況下,這個狀態會被清理
FULLTEXT initialization服務器正準備執行自然語言全文搜索。
init

這發生在ALTER TABLE的初始化之前,刪除,插入,選擇,或更新語句。服務器在這個狀態下所採取的操作包括沖洗二進制日誌、InnoDB日誌和一些查詢緩存清理操作。對於end狀態,以下操作可能會發生:

1.在表格中的數據被更改後刪除查詢緩存條目

2.將事件寫入二進制日誌

3.釋放內存緩衝區,包括blob

Killed有人給線程發送了一個KILL語句,它應該在下一次檢查KILL標誌時終止。在MySQL的每個主要循環中都要檢查國旗,但在某些情況下,線程可能需要很短的時間才能死。如果線程被其他線程鎖定,那麼當其他線程釋放鎖時,kill就會生效。
logging slow query線程正在爲慢查詢日誌寫一個語句。
login連接線程的初始狀態,直到客戶端成功驗證爲止。
manage keys服務器啓用或禁用表索引。
NULLz這個狀態被用於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 lockFLUSH TABLES WITH READ LOCK 等待一個提交鎖
Waiting for global read lockFLUSH TABLES WITH READ LOCK 正在等待全局讀鎖,或者正在設置全局readonly系統變量。

Waiting for tables


該線程得到了一個通知,表明表的底層結構已經發生了變化,它需要重新打開表來獲得新的結構。但是,要重新打開表,它必須等到所有其他線程都關閉了這個表。
如果另一個線程使用了刷新表或下面的表中的一個語句:刷新表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

這些狀態表示等待元數據鎖:

  • Waiting for event metadata lock

  • Waiting for global read lock

  • Waiting for schema metadata lock

  • Waiting for stored function metadata lock

  • Waiting for stored procedure metadata lock

  • Waiting for table metadata lock

  • Waiting for trigger metadata lock



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章