1. 程式人生 > 其它 >MySQL如何檢視執行緒資訊?看完就懂了

MySQL如何檢視執行緒資訊?看完就懂了

技術標籤:資料庫資料庫mysql運維

目錄

前言

在某些情況下,我們可能需要找出Mysql的某個執行緒。比如在發生死鎖的時候,我們可以相應找到鎖執行緒,然後把它kill 。那麼,如何檢視MySQL的執行緒資訊呢?使用下面這個命令就可以了


SHOW PROCESSLIST

SHOW PROCESSLIST語句可以檢視MySQL的執行緒資訊。SHOW PROCESSLIST可以顯示哪些執行緒正在執行和相關的資訊。

語法:

SHOW [FULL] PROCESSLIST

不在mysql提示符下使用時用mysql -uroot -e ‘Show processlist’ 或者 mysqladmin processlist

如果您擁有PROCESS許可權(比如root賬號),您可以檢視所有執行緒,甚至屬於其他使用者的執行緒。否則,非匿名使用者可以訪問自己執行緒的資訊(登入的使用者自己的執行緒),但不能訪問其他使用者的執行緒,匿名使用者無法訪問執行緒資訊。

如果沒有FULL關鍵字,SHOW PROCESSLIST只在Info欄位中顯示每個語句的前100個字元。

執行緒可以用KILL語句終止。

示例:

在這裡插入圖片描述
引數

id       #ID標識,要kill一個語句的時候很有用
use      #當前連線使用者
host     #顯示這個連線從哪個ip的哪個埠上發出
db       #執行緒連線的資料庫,如果沒有選擇,則為NULL。
command #客戶端執行緒正在執行的命令型別,一般有休眠(sleep),查詢(query),連線(connect),例如會話空閒則休眠 time #連線持續時間,單位是秒 state #指示執行緒正在做什麼的動作、事件或狀態。大多數狀態對應於非常快速的操作。如果一個執行緒在給定狀態中停留了許多秒,那麼可能存在需要調查的問題。 info #執行緒正在執行的語句,如果沒有執行語句,則為NULL。該語句可以是傳送到伺服器的語句,也可以是最內層的語句(如果該語句執行其他語句的話)。例如,如果一個CALL語句執行一個正在執行SELECT語句的儲存過程,則Info值顯示SELECT語句。

其中state的狀態十分關鍵,下面介紹下state主要狀態和描述:

altering table
伺服器正在執行一個ALTER TABLE

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

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

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

Closing tables	
正在將表中修改的資料重新整理到磁碟中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是,請檢查磁碟是否已滿,磁碟是否被大量使用。

copy to tmp table
執行緒正在處理一條ALTER TABLE語句。這種狀態發生在建立了具有新結構的表之後,但在將行復制到該表之前。

Copying to tmp table on disk	
由於臨時結果集大於tmp_table_size,正在將臨時表從記憶體儲存轉為磁碟儲存以此節省記憶體。

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

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

end
這發生在ALTER TABLECREATE VIEWDELETEINSERTSELECTUPDATE語句清理之前的末尾。

對於結束狀態,可能會發生以下操作:

1、修改表中的資料後刪除查詢快取項
2、將事件寫入二進位制日誌
3、釋放記憶體緩衝區,包括用於blob的緩衝區

executing
執行緒開始執行一條語句。


init
這發生在ALTER TABLEDELETEINSERTSELECTUPDATE語句初始化之前。在這種狀態下,伺服器採取的操作包括清空二進位制日誌、InnoDB日誌和一些查詢快取清理操作。


Killed
傳送了一個kill請求給某執行緒,那麼這個執行緒將會檢查kill標誌位,同時會放棄下一個kill請求。MySQL會在每次的主迴圈中檢查kill標誌位,不過有些情況下該執行緒可能會過一小段才能死掉。如果該執行緒程被其他執行緒鎖住了,那麼kill請求會在其他執行緒釋放鎖時生效。



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


manage keys
伺服器正在啟用或禁用一個表索引。

Opening tables
執行緒試圖開啟一個表。這應該是一個非常快的過程,除非有什麼東西阻止開啟。例如,ALTER TABLELOCK TABLE語句可以阻止開啟一個表,直到語句完成。還需要檢查table_open_cache值是否足夠大。


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


query end
此狀態發生在處理查詢之後,但在釋放項狀態之前。


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


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

Receiving from client
伺服器正在從客戶端讀取資料包。在MySQL 5.7.8之前,這個狀態叫做Reading from net。


Reopen tables
執行緒獲得了表的鎖,但在獲得鎖後注意到底層表結構發生了變化。它釋放了鎖,關閉了表,並試圖重新開啟它。


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

starting
語句執行開始的第一個階段。

Sending data
執行緒正在讀取和處理SELECT語句的行,並向客戶機發送資料。由於在此狀態下發生的操作往往會執行大量的磁碟訪問(讀取),因此在給定查詢的生命週期中,它通常是執行時間最長的狀態。

Sorting for group
執行緒正在進行排序,以滿足GROUP BY的要求。


Sorting for order
執行緒正在執行排序以滿足ORDER BYstatistics
伺服器正在計算統計資料以制定查詢執行計劃。如果一個執行緒長時間處於這種狀態,那麼伺服器可能是磁碟繫結的,正在執行其他工作。

System lock
執行緒呼叫了mysql_lock_tables(),並且執行緒狀態一直沒有更新。這是一種非常普遍的狀態,可能由於許多原因而發生。

例如,執行緒將請求或等待表的內部或外部系統鎖。當InnoDB在執行鎖表時等待表級鎖時,就會發生這種情況。如果這種狀態是由外部鎖請求引起的,並且您沒有使用多個正在訪問相同MyISAM表的mysqld伺服器,您可以使用——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正在等待提交鎖。


Waiting for global read lock
帶讀鎖的FLUSH TABLES正在等待一個全域性讀鎖,或者正在設定全域性read_only系統變數。

Waiting for tables
執行緒收到一個通知,說表的底層結構發生了變化,它需要重新開啟表以獲得新的結構。但是,要重新開啟表,它必須等待所有其他執行緒都關閉了相關的表。

Waiting for lock_type lock

伺服器正在等待獲取THR_LOCK鎖或者元資料鎖,其中lock_type表示鎖的型別。

下面這個狀態表示等待THR_LOCK鎖:

Waiting for table level lock

下面這些狀態表示等待元資料鎖(metadata 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