如果資料庫慢了,想要看看mysql正在幹什麼,可以執行這個語句,可以列出mysql當前串連在執行的sql語句。
Id User
Host db Command Time State Info
2599
oa SVCTAG-91FFF2X:3726 penguin
Sleep 7321 <null>
2956
rw_penguin
SVCTAG-6HKDF2X:5481
penguin Sleep 2293 <null>
2957
rw_penguin
CYSY-DL580-2:3925 penguin Sleep
2162 <null>
2963
rw_penguin
CYSY-DL580-2:4122 penguin Sleep
2162 <null>
2965
rw_penguin
CYSY-DL580-2:4270 penguin Sleep
2162 <null>
………………………………………………………………
以下內容摘自手冊
SHOW PROCESSLIST顯示哪些線程正在運行。您也可以使用mysqladmin
processlist語句得到此資訊。如果您有SUPER許可權,您可以看到所有線程。否則,您只能看到您自己的線程(也就是,與您正在使用的MySQL賬戶相關的線程)。如果您不使用FULL關鍵詞,則只顯示每個查詢的前100個字元。
本語句報告TCP/IP串連的主機名稱(採用host_name:client_port格式),以方便地判定哪個用戶端正在做什麼。
如果您得到“too many connections”錯誤資訊,並且想要瞭解正在發生的情況,本語句是非常有用的。MySQL保留一個額外的串連,讓擁有SUPER許可權的賬戶使用,以確保管理員能夠隨時串連和檢查系統(假設您沒有把此許可權給予所有的使用者)。
在來自SHOW PROCESSLIST的輸出中常見的一些狀態:
· Checking table
線程正在執行(自動)表格檢查。
· Closing tables
意味著線程正在重新整理更改後的表資料,並正在關閉使用過的表。這應該是一個快速的操作。如果不快,則您應該驗證您的磁碟沒有充滿,並且磁碟沒有被超負荷使用。
· Connect Out
串連到主伺服器上的從屬伺服器。
· Copying to tmp table on disk
臨時結果集合大於tmp_table_size。線程把暫存資料表從儲存空間內部格式改變為磁碟模式,以節約儲存空間。
· Creating tmp table
線程正在建立一個暫存資料表,以保持部分結果。
· deleting from main table
伺服器正在執行多表刪除的第一部分,只從第一個表中刪除。
· deleting from reference tables
伺服器正在執行多表刪除的第二部分,從其它表中刪除匹配的行。
· Flushing tables
線程正在執行FLUSH TABLES,並正在等待所有線程,以關閉表。
· FULLTEXT initialization
伺服器正在準備執行一個自然語言全文本搜尋。
· Killed
有人已經向線程發送了一個KILL命令。在下一次檢查終止標記時,應放棄。該標記在MySQL的每個大迴圈中都檢查,但是在有些情況下,線程終止只需要較短的時間。如果該線程被其它線程鎖定,則只要其它線程接觸鎖定,終止操作就會生效。
· Locked
該查詢被其它查詢鎖定。
· Sending data
線程正在為SELECT語句處理行,同時正在向用戶端發送資料。
· Sorting for group
線程進行中分類,以滿足GROUP BY要求。
· Sorting for order
線程進行中分類,以滿足ORDER BY要求。
· Opening tables
線程正在試圖開啟一個表。這應該是非常快的過程,除非開啟操作受到阻止。例如,一個ALTER
TABLE或一個LOCK TABLE語句可以阻止開啟一個表,直到陳述式完成為止。
· Removing duplicates
查詢正在使用SELECT DISTINCT。使用時,在早期階段,MySQL不能最佳化不同的操作。因此,MySQL要求一個額外的階段,以便在把結果發送給用戶端之前取消所有的複製行。
· Reopen table
線程得到一個表鎖定,但是在得到鎖定後被通知帶下方的表結構已更改了。它已經釋放了鎖定,關閉了表,並試圖重新開啟它。
· Repair by sorting
修複代碼正在使用一個分類來建立索引。
· Repair with keycache
修複代碼正在通過關金鑰快取一個接一個地使用建立關鍵字。這比通過分類修複要慢很多。
· Searching rows for update
線程進行中第一階段,以在更新之前,尋找所有匹配的行。如果UPDATE正在更改用於尋找相關行的索引,則必須這麼做。
· Sleeping
線程正在等待用戶端,以向它發送一個新語句。
· System lock
線程正在等待得到一個用於表的外部系統鎖定。如果您沒有正在使用多個正在訪問同一個表的mysqld伺服器,則您可以使用--skip-external-locking選項禁用系統鎖定。
· Upgrading lock
INSERT DELAYED管理程式正在試圖得到一個表鎖定,以插入行。
· Updating
線程正在搜尋行,並正在更新這些行。
· User Lock
線程正在等待GET_LOCK()。
· Waiting for tables
線程得到一個通知,表的底層結構已經改變,需要重新開啟表以得到新的結構。但是,為了能重新開啟表,必須等待,直到所有其它的線程已經關閉了正在被質詢的表。
如果其它線程已經對正在被質詢的表使用了FLUSH TABLES或以下語句之一:FLUSH
TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE或OPTIMIZE
TABLE;則會出現通知。
· waiting for handler insert
INSERT DELAYED管理程式已經處理了所有處於等待狀態的插入,並正在等待新插入。
多數狀態對應於非常快的操作。如果一個線程在這些狀態下停留了數秒,則可能是有問題,需要進行調查。
有一些其它的狀態,在前面的清單中沒有提及,但是其中有很多狀態對於尋找伺服器中的程式錯誤是有用的。
從這裡可以看到是不是有表鎖死了,是不是有些語句執行了很久,甚至可以通過kill id 語句滅了搗亂的串連。
參考:http://tech.it168.com/a2009/0526/577/000000577940.shtml