processlist中狀態詳解

在processlist中,看到哪些運行狀態時要引起關注,主要有下面幾個:

狀態 建議
copy to tmp table 執行ALTER TABLE修改表結構時建議:放在凌晨執行或者採用類似pt-osc工具
Copying to tmp table 拷貝數據到內存中的臨時表,常見於GROUP BY操作時建議:創建適當的索引
Copying to tmp table on disk 臨時結果集太大,內存中放不下,需要將內存中的臨時表拷貝到磁盤上,形成 #sql***.MYD、#sql***.MYI(在5.6及更高的版本,臨時表可以改成InnoDB引擎了,可以參考選項default_tmp_storage_engine建議:創建適當的索引,並且適當加大sort_buffer_size/tmp_table_size/max_heap_table_size
Creating sort index 當前的SELECT中需要用到臨時表在進行ORDER BY排序建議:創建適當的索引
Creating tmp table 創建基於內存或磁盤的臨時表,當從內存轉成磁盤的臨時表時,狀態會變成:Copying to tmp table on disk建議:創建適當的索引,或者少用UNION、視圖(VIEW)、子查詢(SUBQUERY)之類的,確實需要用到臨時表的時候,可以在session級臨時適當調大 tmp_table_size/max_heap_table_size 的值
Reading from net 表示server端正通過網絡讀取客戶端發送過來的請求建議:減小客戶端發送數據包大小,提高網絡帶寬/質量
Sending data 從server端發送數據到客戶端,也有可能是接收存儲引擎層返回的數據,再發送給客戶端,數據量很大時尤其經常能看見備註:Sending Data不是網絡發送,是從硬盤讀取,發送到網絡是Writing to net

 

建議:通過索引或加上LIMIT,減少需要掃描並且發送給客戶端的數據量

Sorting result 正在對結果進行排序,類似Creating sort index,不過是正常表,而不是在內存表中進行排序建議:創建適當的索引
statistics 進行數據統計以便解析執行計劃,如果狀態比較經常出現,有可能是磁盤IO性能很差建議:查看當前io性能狀態,例如iowait
Waiting for global read lock FLUSH TABLES WITH READ LOCK整等待全局讀鎖建議:不要對線上業務數據庫加上全局讀鎖,通常是備份引起,可以放在業務低谷期間執行或者放在slave服務器上執行備份
Waiting for tables,Waiting for table flush FLUSH TABLES, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE等需要刷新表結構並重新打開建議:不要對線上業務數據庫執行這些操作,可以放在業務低谷期間執行
Waiting for lock_type 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 level lock• Waiting for table metadata lock• Waiting for trigger metadata lock建議:比較常見的是上面提到的global read lock以及table metadata lock,建議不要對線上業務數據庫執行這些操作,可以放在業務低谷期間執行。如果是table level lock,通常是因爲還在使用MyISAM引擎表,趕緊轉投InnoDB引擎吧,別再老頑固了

更多詳情可參考官方手冊:8.14.2 General Thread States

 

8.14.2通用線程狀態

下表描述了State 與常規查詢處理而非更專門的活動(如複製)相關聯的線程值。其中許多僅用於發現服務器中的錯誤。

  • After create

    當線程在創建表的函數的末尾創建表(包括內部臨時表)時,會發生這種情況。即使由於某些錯誤而無法創建表,也會使用此狀態。

  • altering table

    服務器正在執行就地服務 ALTER TABLE

  • Analyzing

    該線程正在計算MyISAM表鍵分佈(例如for ANALYZE TABLE)。

  • checking permissions

    線程正在檢查服務器是否具有執行該語句所需的特權。

  • Checking table

    線程正在執行表檢查操作。

  • cleaning up

    該線程已處理一個命令,並準備釋放內存並重置某些狀態變量。

  • closing tables

    線程正在將已更改的表數據刷新到磁盤並關閉已使用的表。這應該是一個快速的操作。如果沒有,請驗證您沒有完整的磁盤,並且磁盤使用率不是很高。

  • committing alter table to storage engine

    服務器已就地完成 ALTER TABLE並提交結果。

  • converting HEAP to MyISAM

    線程正在將內部臨時表從 MEMORY錶轉換爲磁盤 MyISAM表。

  • copy to tmp table

    線程正在處理一條ALTER TABLE語句。在創建具有新結構的表之後但在將行復制到表中之前,將發生此狀態。

  • Copying to group table

    如果語句具有不同的條件ORDER BY和 GROUP BY條件,則行將按組排序並複製到臨時表中。

  • Copying to tmp table

    服務器正在複製到內存中的臨時表。

  • Copying to tmp table on disk

    服務器正在複製到磁盤上的臨時表。臨時結果集太大(請參見 第8.4.4節“ MySQL中的內部臨時表使用”)。因此,線程將臨時表從內存中更改爲基於磁盤的格式,以節省內存。

  • Creating index

    線程正在處理ALTER TABLE ... ENABLE KEYS一個MyISAM表。

  • Creating sort index

    線程正在處理 SELECT使用內部臨時表解析的。

  • creating table

    該線程正在創建一個表。這包括創建臨時表。

  • Creating tmp table

    該線程正在內存或磁盤上創建一個臨時表。如果該表是在內存中創建的,但後來又轉換爲磁盤表,則該操作期間的狀態將爲Copying to tmp table on disk

  • deleting from main table

    服務器正在執行多表刪除的第一部分。它僅從第一個表中刪除,並保存要用於從其他(參考)表中刪除的列和偏移量。

  • deleting from reference tables

    服務器正在執行多表刪除的第二部分,並從其他表中刪除匹配的行。

  • discard_or_import_tablespace

    線程正在處理ALTER TABLE ... DISCARD TABLESPACEor ALTER TABLE ... IMPORT TABLESPACE語句。

  • end

    這發生在結束,但的清理之前 ALTER TABLE, CREATE VIEW, DELETE, INSERT, SELECT,或 UPDATE語句。

  • executing

    該線程已開始執行一條語句。

  • Execution of init_command

    線程正在使用init_command系統變量的值執行語句 。

  • freeing items

    線程已執行命令。在此狀態下完成的一些項目釋放涉及查詢緩存。此狀態通常後跟cleaning up

  • FULLTEXT initialization

    服務器正在準備執行自然語言的全文本搜索。

  • init

    出現這種情況的初始化之前 ALTER TABLE, DELETE, INSERT, SELECT,或 UPDATE語句。服務器在此狀態下采取的操作包括刷新二進制日誌,InnoDB日誌和一些查詢緩存清除操作。

    對於end狀態,可能發生以下操作:

    • 更改表中的數據後刪除查詢緩存條目

    • 將事件寫入二進制日誌

    • 釋放內存緩衝區,包括用於blob的緩衝區

  • Killed

    有人KILL 向該線程發送了一條語句,下次檢查kill標誌時,它應該中止。在MySQL的每個主循環中都檢查該標誌,但是在某些情況下,線程死亡可能仍需要很短的時間。如果該線程被某個其他線程鎖定,則殺死操作將在另一個線程釋放其鎖定後立即生效。

  • logging slow query

    線程正在將一條語句寫入慢速查詢日誌。

  • login

    連接線程的初始狀態,直到客戶端已成功通過身份驗證。

  • manage keys

    服務器正在啓用或禁用表索引。

  • NULL

    此狀態用於SHOW PROCESSLIST狀態。

  • Opening tables

    線程正在嘗試打開表。除非有什麼阻止打開的步驟,否則這應該是非常快速的過程。例如,一個ALTER TABLE或 LOCK TABLE語句可以阻止打開表,直到該語句完成爲止。還值得檢查您的table_open_cache價值是否足夠大。

  • optimizing

    服務器正在對查詢執行初始優化。

  • preparing

    此狀態在查詢優化期間發生。

  • preparing for alter table

    服務器正在準備執行就地 ALTER TABLE

  • Purging old relay logs

    該線程正在刪除不需要的中繼日誌文件。

  • query end

    此狀態在處理查詢之後但在該freeing items狀態之前發生 。

  • Reading from net

    服務器正在從網絡讀取數據包。

  • Removing duplicates

    查詢的使用 SELECT DISTINCT方式使得MySQL無法在早期階段優化獨特的操作。因此,MySQL需要一個額外的階段來刪除所有重複的行,然後再將結果發送給客戶端。

  • removing tmp table

    線程在處理SELECT 語句後正在刪除內部臨時表。如果沒有創建臨時表,則不使用此狀態。

  • rename

    線程正在重命名錶。

  • rename result table

    該線程正在處理一條ALTER TABLE語句,已經創建了新表,並且正在重命名它以替換原始表。

  • Reopen tables

    線程獲得了該表的鎖,但在獲得該鎖後注意到底層表結構已更改。它釋放了鎖,關閉了表,並試圖重新打開它。

  • Repair by sorting

    修復代碼正在使用某種排序來創建索引。

  • Repair done

    該線程已完成對MyISAM表的多線程修復 。

  • Repair with keycache

    修復代碼正在通過密鑰緩存一一創建密鑰。這比慢得多Repair by sorting

  • Rolling back

    線程正在回滾事務。

  • Saving state

    對於MyISAM表操作(例如修復或分析),線程會將新表狀態保存到.MYI文件頭。狀態包括行數, AUTO_INCREMENT計數器和鍵分佈等信息。

  • Searching rows for update

    該線程正在執行第一個階段,以在更新所有匹配的行之前找到它們。如果 UPDATE更改了用於查找所涉及行的索引,則必須執行此操作。

  • Sending data

    線程正在讀取和處理SELECT語句的行 ,並將數據發送到客戶端。因爲在此狀態下發生的操作往往會執行大量磁盤訪問(讀取),所以它通常是給定查詢生命週期中運行時間最長的狀態。

  • setup

    線程正在開始ALTER TABLE操作。

  • Sorting for group

    線程正在做某種排序以滿足GROUP BY

  • Sorting for order

    線程正在做某種排序以滿足ORDER BY

  • Sorting index

    該線程正在對索引頁進行排序,以在MyISAM表優化操作期間更有效地進行訪問。

  • Sorting result

    對於SELECT語句,這與相似Creating sort index,但對於非臨時表。

  • statistics

    服務器正在計算統計信息以制定查詢執行計劃。如果線程長時間處於此狀態,則服務器可能是磁盤綁定的,正在執行其他工作。

  • System lock

    從此線程已被調用mysql_lock_tables() ,並且線程狀態尚未更新。這是一種非常普遍的狀態,可能由於多種原因而發生。

    例如,線程將要請求或正在等待表的內部或外部系統鎖定。InnoDB在執行期間等待表級鎖定時, 可能會發生這種情況LOCK TABLES。如果此狀態是由對外部鎖的請求引起的,並且您沒有使用正在訪問同一 表的多個mysqld服務器,則MyISAM可以使用該--skip-external-locking 選項禁用外部系統鎖 。但是,默認情況下禁用外部鎖定,因此此選項可能無效。對於 SHOW PROFILE,此狀態表示線程正在請求鎖定(不等待它)。

  • update

    線程已準備好開始更新表。

  • Updating

    線程正在搜索要更新的行,並且正在更新它們。

  • updating main table

    服務器正在執行多表更新的第一部分。它僅更新第一個表,並保存要用於更新其他(參考)表的列和偏移量。

  • updating reference tables

    服務器正在執行多表更新的第二部分,並從其他表更新匹配的行。

  • User lock

    該線程將要請求或正在等待通過GET_LOCK()調用請求的諮詢鎖定 。對於 SHOW PROFILE,此狀態表示線程正在請求鎖定(不等待它)。

  • User sleep

    該線程已調用 SLEEP()

  • Waiting for commit lock

    FLUSH TABLES WITH READ LOCK 正在等待提交鎖。

  • Waiting for global read lock

    FLUSH TABLES WITH READ LOCK 正在等待全局讀取鎖定或read_only正在設置全局 系統變量。

  • Waiting for tables

    線程收到通知,表明表的基礎結構已更改,因此需要重新打開表以獲取新結構。但是,要重新打開該表,它必須等待,直到所有其他線程關閉了該表。

    這張告示,如果另一個線程使用的地方 FLUSH TABLES或有問題的表下面的語句之一: , , , , ,或 。 FLUSH TABLES tbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE

  • Waiting for table flush

    該線程正在執行FLUSH TABLES並正在等待所有線程關閉其表,或者該線程收到有關表的基礎結構已更改的通知,並且需要重新打開表以獲取新結構。但是,要重新打開該表,它必須等待,直到所有其他線程關閉了該表。

    這張告示,如果另一個線程使用的地方 FLUSH TABLES或有問題的表下面的語句之一: , , , , ,或 。 FLUSH TABLES tbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE

  • Waiting for lock_type lock

    服務器正在等待THR_LOCK從元數據鎖定子系統獲取 鎖或鎖,其中 lock_type指示了鎖的類型。

    此狀態表示正在等待 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

    有關表鎖定指示器的信息,請參見 第8.11.1節“內部鎖定方法”。有關元數據鎖定的信息,請參見第8.11.4節“元數據鎖定”

  • Waiting on cond

    線程正在等待條件變爲真的一般狀態。沒有特定的狀態信息。

  • Writing to net

    服務器正在將數據包寫入網絡。

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