MySQL使用SHOW PROCESSLIST的實(shí)現(xiàn)
1、SHOW PROCESSLIST 顯示進(jìn)程列表
SHOW [FULL] PROCESSLIST 用于查看當(dāng)前MySQL服務(wù)器上的所有運(yùn)行中的進(jìn)程列表信息。這個(gè)命令可以幫助我們了解哪些查詢(xún)正在執(zhí)行,它們的狀態(tài)是什么,以及它們已經(jīng)執(zhí)行了多長(zhǎng)時(shí)間。
示例:
mysql> SHOW PROCESSLIST; +----+------+-----------+----+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+----+---------+------+-------+------------------+ | 5 | root | localhost | | Query | 0 | init | show processlist | +----+------+-----------+----+---------+------+-------+------------------+ 1 row in set (0.00 sec)
其中每行顯示的信息包括:
- Id: 線(xiàn)程的唯一標(biāo)識(shí)符。
- User: 執(zhí)行該命令的用戶(hù)名。
- Host: 用戶(hù)的主機(jī)名。通常是客戶(hù)端IP地址、端口號(hào)或者都有。
- db: 當(dāng)前線(xiàn)程正在工作的數(shù)據(jù)庫(kù)。如果沒(méi)有選定數(shù)據(jù)庫(kù),則為NULL。
- Command: 線(xiàn)程正在執(zhí)行的命令類(lèi)型。例如:Sleep,Query,Locked等。
- Time: 命令開(kāi)始執(zhí)行以來(lái)的秒數(shù)。對(duì)于'Sleep'命令,這是線(xiàn)程進(jìn)入睡眠狀態(tài)的時(shí)間。
- State: 顯示線(xiàn)程的狀態(tài)信息。這對(duì)找出性能問(wèn)題特別有用。
- Info: 顯示線(xiàn)程正在執(zhí)行的查詢(xún)。若沒(méi)有查詢(xún)?cè)趫?zhí)行則該列為NULL。
如果沒(méi)有 FULL 關(guān)鍵字, SHOW PROCESSLIST 則僅顯示 Info 字段中每個(gè)語(yǔ)句的前 100 個(gè)字符。
2、線(xiàn)程Command有以下值:
- Binlog Dump:這是用于將二進(jìn)制日志內(nèi)容發(fā)送到副本的復(fù)制源上的線(xiàn)程。
- Change user:線(xiàn)程正在執(zhí)行更改用戶(hù)操作。
- Close stmt:線(xiàn)程正在關(guān)閉預(yù)備語(yǔ)句。
- Connect:被連接到源的復(fù)制接收器線(xiàn)程以及復(fù)制工作器線(xiàn)程使用。
- Connect Out:副本正在連接到其源。
- Create DB:線(xiàn)程正在執(zhí)行創(chuàng)建數(shù)據(jù)庫(kù)操作。
- Daemon:此線(xiàn)程對(duì)服務(wù)器內(nèi)部而言,不是為客戶(hù)端連接提供服務(wù)的線(xiàn)程。
- Debug:線(xiàn)程正在生成調(diào)試信息。
- Delayed insert:線(xiàn)程是一個(gè)延遲插入處理器。
- Drop DB:線(xiàn)程正在執(zhí)行刪除數(shù)據(jù)庫(kù)操作。
- Error:Execute:線(xiàn)程正在執(zhí)行預(yù)備語(yǔ)句。
- Fetch:線(xiàn)程正在獲取執(zhí)行預(yù)備語(yǔ)句的結(jié)果。
- Field List:線(xiàn)程正在檢索表列的信息。
- Init DB:線(xiàn)程正在選擇默認(rèn)數(shù)據(jù)庫(kù)。
- Kill:線(xiàn)程正在殺死另一個(gè)線(xiàn)程。
- Long Data:線(xiàn)程正在檢索執(zhí)行預(yù)備語(yǔ)句結(jié)果中的長(zhǎng)數(shù)據(jù)。
- Ping:線(xiàn)程正在處理服務(wù)器ping請(qǐng)求。
- Prepare:線(xiàn)程正在準(zhǔn)備預(yù)備語(yǔ)句。
- Processlist:線(xiàn)程正在生成關(guān)于服務(wù)器線(xiàn)程的信息。
- Query:用戶(hù)客戶(hù)端在執(zhí)行查詢(xún)時(shí)使用,由單線(xiàn)程復(fù)制應(yīng)用程序線(xiàn)程使用,以及由復(fù)制協(xié)調(diào)器線(xiàn)程使用。
- Quit:線(xiàn)程正在終止。
- Refresh:線(xiàn)程正在刷新表、日志或緩存,或重置狀態(tài)變量或復(fù)制服務(wù)器信息。
- Register Slave:線(xiàn)程正在注冊(cè)副本服務(wù)器。
- Reset stmt:線(xiàn)程正在重置預(yù)備語(yǔ)句。
- Set option:線(xiàn)程正在設(shè)置或重置客戶(hù)端語(yǔ)句執(zhí)行選項(xiàng)。
- Shutdown:線(xiàn)程正在關(guān)閉服務(wù)器。
- Sleep:線(xiàn)程正在等待客戶(hù)端發(fā)送新的語(yǔ)句給它。
- Statistics:線(xiàn)程正在生成服務(wù)器狀態(tài)信息。
- Time:未使用。
3、線(xiàn)程狀態(tài)State分類(lèi)有以下值
以下列表描述了與通用查詢(xún)處理相關(guān)的線(xiàn)程State值,并且不涉及更專(zhuān)門(mén)的活動(dòng),如復(fù)制。其中許多對(duì)于在服務(wù)器中查找錯(cuò)誤非常有用。
- After create:當(dāng)線(xiàn)程創(chuàng)建一個(gè)表(包括內(nèi)部臨時(shí)表)時(shí),會(huì)出現(xiàn)這種情況,在創(chuàng)建表的函數(shù)結(jié)束時(shí)。即使由于某些錯(cuò)誤無(wú)法創(chuàng)建表,也會(huì)使用此狀態(tài)。
- altering table:服務(wù)器正在執(zhí)行就地ALTER TABLE。
- Analyzing:線(xiàn)程正在計(jì)算MyISAM表鍵分布(例如,用于ANALYZE TABLE)。
- checking permissions:線(xiàn)程正在檢查服務(wù)器是否具有執(zhí)行語(yǔ)句所需的權(quán)限。
- Checking table:線(xiàn)程正在執(zhí)行表檢查操作。
- cleaning up:線(xiàn)程已處理一條命令,并準(zhǔn)備釋放內(nèi)存并重置某些狀態(tài)變量。
- closing tables:線(xiàn)程正在將更改后的表數(shù)據(jù)刷新到磁盤(pán)并關(guān)閉已使用的表。這應(yīng)該是一個(gè)快速的操作。如果不是,驗(yàn)證你是否沒(méi)有滿(mǎn)磁盤(pán),并且磁盤(pán)沒(méi)有在非常繁重的使用中。
- committing alter table to storage engine:服務(wù)器已完成就地ALTER TABLE并正在提交結(jié)果。
- converting HEAP to ondisk:線(xiàn)程正在將內(nèi)部臨時(shí)表從MEMORY表轉(zhuǎn)換為磁盤(pán)上的表。
- copy to tmp table:線(xiàn)程正在處理ALTER TABLE語(yǔ)句。在已創(chuàng)建新結(jié)構(gòu)的表之后但在將行復(fù)制進(jìn)去之前發(fā)生此狀態(tài)。
- 對(duì)于此狀態(tài)的線(xiàn)程,可以使用性能模式來(lái)獲取復(fù)制操作的進(jìn)度。
- Copying to group table:如果語(yǔ)句具有不同的ORDER BY和GROUP BY條件,則將按組排序行并復(fù)制到臨時(shí)表中。
- Copying to tmp table:服務(wù)器正在將數(shù)據(jù)復(fù)制到內(nèi)存中的臨時(shí)表。
- Copying to tmp table on disk:服務(wù)器正在將數(shù)據(jù)復(fù)制到磁盤(pán)上的臨時(shí)表。臨時(shí)結(jié)果集已經(jīng)變得過(guò)大。因此,線(xiàn)程正在將臨時(shí)表從內(nèi)存格式更改為基于磁盤(pán)的格式以節(jié)省內(nèi)存。
- Creating index:線(xiàn)程正在處理MyISAM表的ALTER TABLE ... ENABLE KEYS。
- Creating sort index:線(xiàn)程正在處理使用內(nèi)部臨時(shí)表解析的SELECT。
- creating table:線(xiàn)程正在創(chuàng)建表。這包括創(chuàng)建臨時(shí)表。
- Creating tmp table:線(xiàn)程正在在內(nèi)存或磁盤(pán)上創(chuàng)建臨時(shí)表。如果在內(nèi)存中創(chuàng)建了表,但稍后將其轉(zhuǎn)換為磁盤(pán)上的表,則在該操作期間的狀態(tài)為Copying to tmp table on disk。
- deleting from main table:服務(wù)器正在執(zhí)行多表刪除的第一部分。它只從第一個(gè)表中刪除,并保存列和偏移量以用于從其他(引用)表中刪除。
- deleting from reference tables:服務(wù)器正在執(zhí)行多表刪除的第二部分,并從其他表中刪除匹配的行。
- discard_or_import_tablespace:線(xiàn)程正在處理ALTER TABLE ... DISCARD TABLESPACE或ALTER TABLE ... IMPORT TABLESPACE語(yǔ)句。
- end:在ALTER TABLE,CREATE VIEW,DELETE,INSERT,SELECT或UPDATE語(yǔ)句的結(jié)束但在清理之前發(fā)生。
- 對(duì)于結(jié)束狀態(tài),可能正在發(fā)生以下操作:
- 將事件寫(xiě)入二進(jìn)制日志
- 釋放內(nèi)存緩沖區(qū),包括blob:executing:線(xiàn)程已開(kāi)始執(zhí)行語(yǔ)句。
- Execution of init_command:線(xiàn)程正在執(zhí)行init_command系統(tǒng)變量的值中的語(yǔ)句。
- freeing items:線(xiàn)程已執(zhí)行一條命令。這個(gè)狀態(tài)通常在cleaning up之前出現(xiàn)。
- FULLTEXT initialization:服務(wù)器正在準(zhǔn)備進(jìn)行自然語(yǔ)言全文搜索。
- init:在初始化ALTER TABLE,DELETE,INSERT,SELECT或UPDATE語(yǔ)句之前發(fā)生。在這種狀態(tài)下,服務(wù)器采取的操作包括刷新二進(jìn)制日志和InnoDB日志。
- Killed:有人向線(xiàn)程發(fā)送了一個(gè)KILL語(yǔ)句,它應(yīng)該在下次檢查kill標(biāo)志時(shí)中止。該標(biāo)志在MySQL的每一個(gè)主要循環(huán)中都會(huì)被檢查,但在某些情況下,線(xiàn)程可能還需要短暫的時(shí)間才能死亡。如果線(xiàn)程被其他線(xiàn)程鎖定,則在其他線(xiàn)程釋放其鎖定后立即生效。
- Locking system tables:線(xiàn)程正在嘗試鎖定一個(gè)系統(tǒng)表(例如,一個(gè)時(shí)區(qū)或日志表)。
- logging slow query:線(xiàn)程正在將語(yǔ)句寫(xiě)入慢查詢(xún)?nèi)罩尽?/li>
- login:連接線(xiàn)程的初始狀態(tài),直到客戶(hù)端成功進(jìn)行身份驗(yàn)證。
- manage keys:服務(wù)器正在啟用或禁用表索引。
- Opening system tables:線(xiàn)程正在嘗試打開(kāi)一個(gè)系統(tǒng)表(例如,一個(gè)時(shí)區(qū)或日志表)。
- Opening tables:線(xiàn)程正在嘗試打開(kāi)表。這應(yīng)該是非??焖俚倪^(guò)程,除非有什么阻止打開(kāi)。例如,ALTER TABLE或LOCK TABLE語(yǔ)句可以阻止打開(kāi)表,直到語(yǔ)句完成。還值得檢查您的table_open_cache值是否足夠大。
- 對(duì)于系統(tǒng)表,使用Opening system tables狀態(tài)代替。
- optimizing:服務(wù)器正在為查詢(xún)執(zhí)行初始優(yōu)化。
- preparing:此狀態(tài)在查詢(xún)優(yōu)化期間發(fā)生。
- preparing for alter table:服務(wù)器正在準(zhǔn)備執(zhí)行就地ALTER TABLE。
- Purging old relay logs:線(xiàn)程正在刪除不需要的中繼日志文件。
- query end:處理查詢(xún)后但在freeing items狀態(tài)之前發(fā)生此狀態(tài)。
- Receiving from client:服務(wù)器正在從客戶(hù)端讀取數(shù)據(jù)包。
- Removing duplicates:查詢(xún)正在以SELECT DISTINCT的方式使用,以致MySQL無(wú)法在早期階段優(yōu)化掉DISTINCT操作。由于此原因,MySQL需要一個(gè)額外的階段來(lái)移除所有重復(fù)的行,然后再將結(jié)果發(fā)送給客戶(hù)端。
- removing tmp table:線(xiàn)程在處理完SELECT語(yǔ)句后正在移除內(nèi)部臨時(shí)表。如果沒(méi)有創(chuàng)建臨時(shí)表,則不使用此狀態(tài)。
- rename:線(xiàn)程正在重命名表。
- rename result table:線(xiàn)程正在處理ALTER TABLE語(yǔ)句,已經(jīng)創(chuàng)建了新表,并正將其重命名以替換原始表。
- Reopen tables:線(xiàn)程獲取了表的鎖,但在獲取鎖后發(fā)現(xiàn)表的底層結(jié)構(gòu)已更改。它已釋放了鎖,關(guān)閉了表,正在嘗試重新打開(kāi)它。
- Repair by sorting:修復(fù)代碼使用排序來(lái)創(chuàng)建索引。
- Repair done:線(xiàn)程已完成MyISAM表的多線(xiàn)程修復(fù)。
- Repair with keycache:修復(fù)代碼使用一次通過(guò)鍵緩存創(chuàng)建一個(gè)鍵。這比Repair by sorting慢得多。
- Rolling back:線(xiàn)程正在回滾事務(wù)。
- Saving state:對(duì)于MyISAM表操作,如修復(fù)或分析,線(xiàn)程正在將新表狀態(tài)保存到.MYI文件頭。狀態(tài)包括行數(shù)、AUTO_INCREMENT計(jì)數(shù)器和鍵分布等信息。
- Searching rows for update:線(xiàn)程正在進(jìn)行第一階段,查找所有匹配的行,然后更新它們。如果UPDATE改變了用于查找所涉及行的索引,則必須這樣做。
- Sending data:在MySQL 8.0.17之前:線(xiàn)程正在讀取和處理SELECT語(yǔ)句的行,并將數(shù)據(jù)發(fā)送給客戶(hù)端。因?yàn)樵诖藸顟B(tài)期間發(fā)生的操作傾向于執(zhí)行大量的磁盤(pán)訪(fǎng)問(wèn)(讀取),所以它通常是給定查詢(xún)?cè)谄渖芷趦?nèi)運(yùn)行時(shí)間最長(zhǎng)的狀態(tài)。MySQL 8.0.17及更高版本:此狀態(tài)不再單獨(dú)指示,而是包含在Executing狀態(tài)中。
- Sending to client:服務(wù)器正在將數(shù)據(jù)包寫(xiě)入客戶(hù)端。
- setup:線(xiàn)程開(kāi)始進(jìn)行ALTER TABLE操作。
- Sorting for group:線(xiàn)程正在執(zhí)行排序以滿(mǎn)足GROUP BY。
- Sorting for order:線(xiàn)程正在執(zhí)行排序以滿(mǎn)足ORDER BY。
- Sorting index:線(xiàn)程正在對(duì)索引頁(yè)進(jìn)行排序,以便在MyISAM表優(yōu)化操作期間更有效地訪(fǎng)問(wèn)。
- Sorting result:對(duì)于SELECT語(yǔ)句,此為與Creating sort index類(lèi)似,但適用于非臨時(shí)表。
- starting:語(yǔ)句執(zhí)行開(kāi)始的第一階段。
- statistics:服務(wù)器正在計(jì)算統(tǒng)計(jì)信息以制定查詢(xún)執(zhí)行計(jì)劃。如果線(xiàn)程在此狀態(tài)下停留了很長(zhǎng)時(shí)間,那么服務(wù)器可能在磁盤(pán)綁定中執(zhí)行其他工作。
- System lock:線(xiàn)程已調(diào)用mysql_lock_tables()并且自那時(shí)起線(xiàn)程狀態(tài)未更新。這是一個(gè)非常通用的狀態(tài),可能出于許多原因。
- 例如,線(xiàn)程將請(qǐng)求或正在等待表的內(nèi)部或外部系統(tǒng)鎖。當(dāng)InnoDB在執(zhí)行LOCK TABLES期間等待表級(jí)鎖時(shí),可能會(huì)發(fā)生這種情況。如果由于請(qǐng)求外部鎖而導(dǎo)致這種狀態(tài),并且您沒(méi)有使用訪(fǎng)問(wèn)相同MyISAM表的多個(gè)mysqld服務(wù)器,則可以使用--skip-external-locking選項(xiàng)禁用外部系統(tǒng)鎖。然而,默認(rèn)情況下是禁用外部鎖定的,所以有可能這個(gè)選項(xiàng)沒(méi)有效果。對(duì)于SHOW PROFILE,此狀態(tài)意味著線(xiàn)程正在請(qǐng)求鎖(不是等待它)。
- 對(duì)于系統(tǒng)表,使用Locking system tables狀態(tài)代替。
- update:線(xiàn)程準(zhǔn)備開(kāi)始更新表。
- Updating:線(xiàn)程正在搜索要更新的行并更新它們。
- updating main table:服務(wù)器正在執(zhí)行多表更新的第一部分。它只更新第一個(gè)表,并保存列和偏移量以用于更新其他(引用)表。
- updating reference tables:服務(wù)器正在執(zhí)行多表更新的第二部分,并更新其他表中的匹配行。
- User lock:線(xiàn)程將請(qǐng)求或正在等待使用GET_LOCK()調(diào)用請(qǐng)求的咨詢(xún)鎖。對(duì)于SHOW PROFILE,這種狀態(tài)意味著線(xiàn)程正在請(qǐng)求鎖(而不是等待它)。
- User sleep:線(xiàn)程已調(diào)用SLEEP()。
- Waiting for commit lock:FLUSH TABLES WITH READ LOCK正在等待提交鎖。
- waiting for handler commit:線(xiàn)程正在等待事務(wù)提交,與查詢(xún)處理的其他部分相比。
- Waiting for tables:線(xiàn)程收到通知,表的底層結(jié)構(gòu)已經(jīng)更改,它需要重新打開(kāi)表以獲取新的結(jié)構(gòu)。但是,要重新打開(kāi)表,它必須等待所有其他線(xiàn)程都關(guān)閉了所述表。
- 如果另一個(gè)線(xiàn)程在所述表上使用了FLUSH TABLES或以下語(yǔ)句之一:FLUSH TABLES tbl_name,ALTER TABLE,RENAME TABLE,REPAIR TABLE,ANALYZE TABLE,OPTIMIZE TABLE,則會(huì)發(fā)生此通知。
- Waiting for table flush:線(xiàn)程正在執(zhí)行FLUSH TABLES并等待所有線(xiàn)程關(guān)閉其表,或者線(xiàn)程收到通知說(shuō)表的底層結(jié)構(gòu)已經(jīng)更改,它需要重新打開(kāi)表以獲取新的結(jié)構(gòu)。但是,要重新打開(kāi)表,它必須等待所有其他線(xiàn)程都關(guān)閉了所述表。
- 如果另一個(gè)線(xiàn)程在所述表上使用了FLUSH TABLES或以下語(yǔ)句之一:FLUSH TABLES tbl_name,ALTER TABLE,RENAME TABLE,REPAIR TABLE,ANALYZE TABLE,OPTIMIZE TABLE,則會(huì)發(fā)生此通知。
- Waiting for lock_type lock:服務(wù)器正在等待獲得THR_LOCK鎖或元數(shù)據(jù)鎖定子系統(tǒng)的鎖,其中l(wèi)ock_type指示鎖的類(lèi)型。
- 這種狀態(tài)表示等待一個(gè)THR_LOCK:
- Waiting for table level lock:這些狀態(tài)表示等待元數(shù)據(jù)鎖:
- 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:有關(guān)表鎖指標(biāo)的信息。有關(guān)元數(shù)據(jù)鎖定的信息。要查看哪些鎖阻止了鎖請(qǐng)求。
- Waiting on cond:線(xiàn)程在等待某個(gè)條件變?yōu)檎娴耐ㄓ脿顟B(tài)。沒(méi)有特定的狀態(tài)信息可用。
- Writing to net:服務(wù)器正在將數(shù)據(jù)包寫(xiě)入網(wǎng)絡(luò)。
相關(guān)文章
面試官問(wèn)訂單ID是如何生成的?難道不是MySQL自增主鍵
最近在考慮訂單id怎么生成,下面這篇文章主要給大家介紹了關(guān)于面試官問(wèn)訂單ID是如何生成的?難道不是MySQL自增主鍵的相關(guān)資料,需要的朋友可以參考下2023-02-02mysql常見(jiàn)的錯(cuò)誤提示問(wèn)題處理小結(jié)
本文總結(jié)了在使用mysql過(guò)程中經(jīng)常遇到的3種錯(cuò)誤提示(error1067,error1061,error1045)的問(wèn)題的處理方法,都是本人在實(shí)際應(yīng)用中處理檢驗(yàn)過(guò)的,希望對(duì)大家有所幫助2014-08-08MySQL動(dòng)態(tài)SQL拼接實(shí)例詳解
動(dòng)態(tài)SQL呢?首先是SQL語(yǔ)句,是根據(jù)條件來(lái)拼接SQL,下面這篇文章主要給大家介紹了關(guān)于MySQL動(dòng)態(tài)SQL拼接的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12淺析MYSQL REPEATABLE-READ隔離級(jí)別
REPEATABLE-READ 即可重復(fù)讀,autocommit= 0或者START TRANSACTION狀態(tài)下select表的內(nèi)容不會(huì)改變2014-07-07innodb存儲(chǔ)引擎修改表共享空間為獨(dú)立空間
最近在優(yōu)化mysql innodb存儲(chǔ)引擎,把共享表空間轉(zhuǎn)換成獨(dú)立表空間,下面是詳細(xì)步驟2014-01-01關(guān)于MySQL innodb_autoinc_lock_mode介紹
下面小編就為大家?guī)?lái)一篇關(guān)于MySQL innodb_autoinc_lock_mode介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03