1. 程式人生 > 資料庫 >MySQL SHOW PROCESSLIST協助故障診斷全過程

MySQL SHOW PROCESSLIST協助故障診斷全過程

一、SHOW PROCESSLIST命令

SHOW PROCESSLIST顯示正在執行(使用者執行執行緒)的執行緒(或SHOW FULL PROCESSLIST顯示更多資訊)。您還可以從INFORMATION_SCHEMA PROCESSLIST表或mysqladmin processlist命令獲取此資訊。如果你有這個PROCESS特權,你可以看到所有的執行緒。否則,您只能看到自己的執行緒(即與您正在使用的MySQL帳戶相關聯的執行緒)。如果不使用該FULL關鍵字,則每個語句的前100個字元都將顯示在該Info欄位中。

程序資訊也可從performance_schema.threads表中獲得。但是,訪問threads不需要互斥鎖,對伺服器效能影響最小。INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST由於需要互斥鎖而具有負面的效能後果。performance_schema.threads還顯示有關後臺執行緒,哪些資訊在INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST中沒有,這意味著performance_schema.threads可以用來監視活動的其他執行緒資訊源。

SHOW PROCESSLIST如果您收到“ 太多連線 ” 錯誤訊息,並且想要了解發生了什麼, 該宣告非常有用。MySQL保留一個額外的連線以供有許可權的帳戶使用SUPER,以確保管理員始終能夠連線和檢查系統(假設您沒有向所有使用者授予此許可權)。

執行緒可以用KILL語句殺死。

以下是SHOW PROCESSLIST輸出示例:

mysql> show full processlist\G
*************************** 1. row ***************************
  Id: 123
 User: root
 Host: localhost
  db: performance_schema
Command: Query
 Time: 0
 State: starting
 Info: show full processlist
1 row in set (0.00 sec)

所產生的列SHOW PROCESSLIST具有以下含義:

Id

連線識別符號,這是同一型別的在所顯示的值ID的列INFORMATION_SCHEMA.PROCESSLIST表,該PROCESSLIST_ID效能檢視的列threads 表,並且通過返回的 CONNECTION_ID()功能。

User

發出宣告的MySQL使用者,如果是system user,它是指由伺服器產生的非客戶執行緒,以在內部處理任務。這可能是複製從站或延遲行處理程式使用的I / O或SQL執行緒。unauthenticated user指的是已經與客戶端連線關聯但是還沒有完成客戶機使用者的認證的執行緒。 event_scheduler指的是監視預定事件的執行緒。如果是system user那麼在Host列中不會指定主機 。

Host

發出該語句的客戶端的主機名(system user沒有主機除外),以便更容易地確定哪個客戶端正在做什麼,顯示方式:host_name:client_port。

db

當前執行語句對應的預設資料庫,如果選擇了;否則為NULL。

Command

顯示這個執行緒此刻正在執行的命令,一般對應DDL或DML語句。

Time

表示執行緒處於當前狀態的時間長短,執行緒當前時間的概念在某些情況下可能會發生改變:執行緒可以改變時間。對於正在從主機處理事件的從站上執行的執行緒,執行緒時間設定為事件中發現的時間,因此反映了主站而不是從站的當前時間。SET TIMESTAMP = value。

State

對應Command指令,大多數狀態對應於非常快速的操作。如果執行緒在給定狀態下保持多秒,則可能存在需要調查的問題。

Info

包含由執行緒執行的語句的文字或者NULL,如果它不是執行的話。預設情況下,此值僅包含語句的前100個字元。要檢視完整的語句,請使用SHOW FULL PROCESSLIST。

二、執行緒命令(Command)值

執行緒可以具有以下任何 Command值:

Binlog Dump:這是主伺服器上的執行緒,用於將二進位制日誌內容傳送到從伺服器。

Table Dump:執行緒將表內容傳送到從伺服器。

Change user:執行緒正在執行改變使用者操作。

Close stmt:執行緒正在關閉準備好的語句。

Connect:複製中,從伺服器連線到其主伺服器。

Connect Out:複製中,從伺服器正在連線到其主伺服器。

Create DB:執行緒正在執行create-database操作。

Daemon:此執行緒在伺服器內部,而不是服務客戶端連線的執行緒。

Debug:執行緒正在生成除錯資訊。

Delayed insert:執行緒是一個延遲插入處理程式。

Drop DB:執行緒正在執行drop-database操作。

Execute:執行緒正在執行一個準備好的語句(prepare statement型別就是預編譯的語句,JDBC支援次型別執行SQL)。

Fetch:執行緒正在執行一個準備語句的結果。

Field List:執行緒正在檢索表列的資訊。

Init DB:執行緒正在選擇預設資料庫。

Kill:執行緒正在殺死另一個執行緒。

Long Data:該執行緒在執行一個準備語句的結果中檢索長資料。

Ping:執行緒正在處理伺服器ping請求。

Prepare:執行緒正在為語句生成執行計劃。

Processlist:執行緒正在生成有關伺服器執行緒的資訊。

Query:該執行緒正在執行一個語句。

Quit:執行緒正在終止。

Refresh:執行緒是重新整理表,日誌或快取,或重置狀態變數或複製伺服器資訊。

Register Slave:執行緒正在註冊從伺服器。

Reset stmt:執行緒正在重置一個準備好的語句。

Set option:執行緒正在設定或重置客戶端語句執行選項。

Shutdown:執行緒正在關閉伺服器。

Sleep:執行緒正在等待客戶端向其傳送新的語句。

Statistics:執行緒正在生成伺服器狀態資訊。

Time:沒用過。

三、執行緒狀態(State)值

  • 一般執行緒狀態(State)值

以下列表描述State 了與常規查詢處理關聯的執行緒值,而不是更復雜的活動,例如複製。其中許多僅用於在伺服器中查詢錯誤。

After create:當執行緒建立表(包括內部臨時表)時,會在建立表的函式的末尾建立。即使由於某些錯誤而無法建立表,也會使用此狀態。

Analyzing:執行緒正在計算MyISAM表金鑰分佈(例如:for ANALYZE TABLE)。

checking permissions:執行緒正在檢查伺服器是否具有執行語句所需的許可權。

Checking table:執行緒正在執行表檢查操作。

cleaning up:執行緒已經處理了一個命令,正在準備釋放記憶體並重置某些狀態變數。

closing tables:執行緒將更改的表資料重新整理到磁碟並關閉已用表。這應該是一個快速的操作。如果沒有,請驗證您是否沒有完整的磁碟,並且磁碟沒有被非常大的使用。

copy to tmp table:執行緒正在處理ALTER TABLE語句。此狀態發生在已建立新結構的表之後,但是將行復制到該表之前。對於此狀態的執行緒,可以使用效能模式來獲取有關複製操作的進度。

Copying to group table:如果語句具有不同ORDER BY和GROUP BY標準,各行按組排列和複製到一個臨時表。

Creating index:執行緒正在處理ALTER TABLE … ENABLE KEYS一個MyISAM表。

Creating sort index:執行緒正在處理一個SELECT使用內部臨時表解析的執行緒 。

creating table:執行緒正在建立一個表,這包括建立臨時表。

committing alter table to storage engine:伺服器已經完成就位ALTER TABLE並提交結果。

deleting from main table:伺服器正在執行多表刪除的第一部分,它僅從第一個表中刪除,並從其他(引用)表中儲存要用於刪除的列和偏移量。

deleting from reference tables:伺服器正在執行多表刪除的第二部分,並從其他表中刪除匹配的行。

discard_or_import_tablespace:執行緒正在處理ALTER TABLE … DISCARD TABLESPACE或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,or UPDATE之前發生,伺服器在該狀態中採取的操作包括重新整理二進位制日誌、Innodb日誌和一些查詢快取清理操作。對於最終狀態,可能會發生以下操作:更改表中的資料後刪除查詢快取項、將事件寫入二進位制日誌、釋放記憶體緩衝區,包括blob。

Killed:執行KILL語句,向執行緒傳送了一個宣告,下次檢查kill標誌時應該中斷。在MySQL的每個主迴圈中檢查該標誌,但在某些情況下,執行緒可能需要很短時間才能死掉。如果執行緒被某個其他執行緒鎖定,則一旦其他執行緒釋放鎖定,該kill就會生效。

Locking system tables:執行緒正在嘗試鎖定系統表(例如,時區或日誌表)。

login:連線執行緒的初始狀態,直到客戶端成功認證為止。

manage keys:伺服器啟用或禁用表索引。

NULL:該狀態用於SHOW PROCESSLIST狀態。

Opening system tables:執行緒嘗試開啟系統表(例如,時區或日誌表)。

Opening tables:執行緒正在嘗試開啟一個表,這應該是非常快的程式,除非有事情阻止開啟。例如,一個ALTER TABLE或一個LOCK TABLE語句可以阻止開啟一個表,直到語句完成。還可能需要關注table_open_cache引數的值是否足夠大。對於系統表,使用Opening system tables狀態。

optimizing:伺服器正在執行查詢的初始優化。

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

Purging old relay logs:執行緒正在刪除不需要的中繼日誌檔案。

query end:處理查詢之後,freeing items狀態之前會發生這種狀態。

Removing duplicates:該查詢的使用SELECT DISTINCT方式使得MySQL不能在早期階段優化不同的操作。因此,MySQL需要一個額外的階段來刪除所有重複的行,然後將結果傳送給客戶端。

removing tmp table:處理語句後,該執行緒正在刪除一個內部臨時表SELECT 。如果沒有建立臨時表,則不使用該狀態。

rename:執行緒正在重新命名一個表。

rename result table:執行緒正在處理一個ALTER TABLE語句,已經建立了新表,並重新命名它來替換原始表。

Reopen tables:執行緒獲得了表的鎖,但在獲得基礎表結構更改的鎖之後注意到。它釋放了鎖,關閉了table,並試圖重新開啟它。

Repair by sorting:修復程式碼正在使用排序來建立索引。

preparing for alter table:伺服器正在準備就地執行ALTER TABLE。

Repair done:執行緒已經完成了一個MyISAM表的多執行緒修復 。

Repair with keycache:修復程式碼通過金鑰快取逐個使用建立金鑰,這比慢得多Repair by sorting。

Rolling back:執行緒正在回滾事務。

Saving state:對於MyISAM表操作(如修復或分析),執行緒將新的表狀態儲存到.MYI檔案頭。狀態包括行數, AUTO_INCREMENT計數器和鍵分佈等資訊。

Searching rows for update:執行緒正在進行第一階段,以便在更新之前查詢所有匹配的行。如果UPDATE要更改用於查詢涉及的行的索引,則必須執行此操作 。

setup:執行緒正在開始一個ALTER TABLE操作。

Sorting for group:執行緒正在做一個滿足一個GROUP BY。

Sorting for order:執行緒正在做一個滿足一個ORDER BY。

Sorting index:執行緒是排序索引頁,以便在MyISAM表優化操作期間更有效地訪問。

Sorting result:對於一個SELECT語句,這類似於Creating sort index,但是對於非臨時表。

statistics:伺服器正在計算統計資訊以開發查詢執行計劃。如果一個執行緒長時間處於這種狀態,伺服器可能是磁碟繫結的,執行其他工作。

update:執行緒正在準備開始更新表。

Updating:執行緒正在搜尋要更新的行並正在更新它們。

updating main table:伺服器正在執行多表更新的第一部分,它僅更新第一個表,並儲存用於更新其他(引用)表的列和偏移量。

updating reference tables:伺服器正在執行多表更新的第二部分,並從其他表更新匹配的行。

User lock:執行緒將要求或正在等待通過GET_LOCK()呼叫請求的諮詢鎖定 。因為 SHOW PROFILE,這個狀態意味著執行緒正在請求鎖定(不等待它)。

User sleep:執行緒呼叫了一個 SLEEP()呼叫。

  • 故障診斷狀態(State)值(個人提取)

logging slow query:執行緒正在向慢查詢日誌寫入語句。

altering table:伺服器正在執行就地ALTER TABLE。

Receiving from client:伺服器正在從客戶端讀取資料包。

Copying to tmp table:伺服器正在複製磁碟到記憶體的臨時表,是直接在磁碟建立的臨時表而並非從記憶體轉到磁碟的臨時表。

Copying to tmp table on disk:對於執行緒將臨時表從記憶體中更改為基於磁碟的格式儲存以節省記憶體後,又把臨時表從磁碟複製到記憶體時的狀態。

Creating tmp table:執行緒正在記憶體或磁碟上建立臨時表。如果表在記憶體中建立,但後來轉換為磁碟表,則該操作中的狀態將為Copying to tmp table on disk。

Sending data:執行緒正在讀取和處理SELECT語句的行,並將資料傳送到客戶端。由於在此狀態期間發生的操作往往執行大量的磁碟訪問(讀取),所以在給定查詢的整個生命週期內通常是最長的執行狀態。

Sending to client:伺服器正在向客戶端寫入資料包。

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_name,ALTER TABLE,RENAME TABLE,REPAIR TABLE,ANALYZE TABLE,或OPTIMIZE TABLE都會發生通知。

Waiting for table flush:執行緒正在執行FLUSH TABLES並正在等待所有執行緒關閉它們的表,或者執行緒得到一個通知,表中的底層結構已經改變,並且需要重新開啟表以獲得新的結構。但是,要重新開啟表,必須等到所有其他執行緒都關閉該表。如果另一個執行緒已使用FLUSH TABLES或下面的語句之一:FLUSH TABLES tbl_name,或OPTIMIZE 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。

Writing to net:伺服器正在將資料包寫入網路,如果一個執行緒長時間在執行並且一直處於Writing to net狀態,那麼一直在傳送資料包到網路,可以試著調整max_allowed_packet大小。另外,這可能會導致其他執行緒大量阻塞。

Waiting on cond:執行緒等待條件成為true的一般狀態,沒有特定的狀態資訊可用。

System lock:執行緒已經呼叫mysql_lock_tables() ,且執行緒狀態從未更新。這是一個非常普遍的狀態,可能由於許多原因而發生。例如,執行緒將請求或正在等待表的內部或外部系統鎖。當InnoDB在執行鎖表時等待表級鎖時,可能會發生這種情況。如果此狀態是由於請求外部鎖而導致的,並且不使用正在訪問相同表的多個mysqld伺服器MyISAM,則可以使用該–skip-external-locking選項禁用外部系統鎖 。但是,預設情況下禁用外部鎖定,因此這個選項很有可能不起作用。因為SHOW PROFILE,這個狀態意味著執行緒正在請求鎖定(不等待它)。對於系統表,使用Locking system tables狀態。

  • 查詢快取狀態(State)值

checking privileges on cached query:伺服器正在檢查使用者是否具有訪問快取查詢結果的許可權。

checking query cache for query:伺服器正在檢查當前查詢是否存在於查詢快取中。

invalidating query cache entries:查詢快取條目被標記為無效,因為底層表已更改。

sending cached result to client:伺服器正在從查詢快取中獲取查詢的結果,並將其傳送給客戶端。

storing result in query cache:伺服器將查詢結果儲存在查詢快取中。

Waiting for query cache lock:當會話正在等待採取查詢快取鎖定時,會發生此狀態。這種情況可能需要執行一些查詢快取操作,如使查詢快取無效的INSERT或DELETE語句,以及RESET QUERY CACHE等等。

  • 事件排程器執行緒狀態(State)值

這些狀態適用於事件排程程式執行緒,建立用於執行排程事件的執行緒或終止排程程式的執行緒。

Clearing

排程程式執行緒或正在執行事件的執行緒正在終止,即將結束。

Initialized

排程程式執行緒或將執行事件的執行緒已初始化。

Waiting for next activation

排程程式具有非空事件佇列,但下一次啟用是將來。

Waiting for scheduler to stop

執行緒發出SET GLOBAL event_scheduler=OFF並正在等待排程程式停止。

Waiting on empty queue

排程程式的事件佇列是空的,它正在休眠。

  • 其他

除了上述幾類,還有如複製主執行緒狀態(State)值、複製從庫IO執行緒狀態(State)值、複製從庫SQL執行緒(State)值、複製從庫Connect執行緒(State)值、詳情可見:MySQL主從複製執行緒狀態轉變

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。