您好,登錄后才能下訂單哦!
小編給大家分享一下MySQL中SHOW PROCESSLIST協(xié)助故障診斷全過程的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
一、SHOW PROCESSLIST命令
SHOW PROCESSLIST顯示正在運(yùn)行(用戶運(yùn)行線程)的線程(或SHOW FULL PROCESSLIST顯示更多信息)。您還可以從INFORMATION_SCHEMA PROCESSLIST表或mysqladmin processlist命令獲取此信息。如果你有這個(gè)PROCESS特權(quán),你可以看到所有的線程。否則,您只能看到自己的線程(即與您正在使用的MySQL帳戶相關(guān)聯(lián)的線程)。如果不使用該FULL關(guān)鍵字,則每個(gè)語句的前100個(gè)字符都將顯示在該Info字段中。
進(jìn)程信息也可從performance_schema.threads表中獲得。但是,訪問threads不需要互斥鎖,對服務(wù)器性能影響最小。INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST由于需要互斥鎖而具有負(fù)面的性能后果。performance_schema.threads還顯示有關(guān)后臺線程,哪些信息在INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST中沒有,這意味著performance_schema.threads可以用來監(jiān)視活動的其他線程信息源。
SHOW PROCESSLIST如果您收到“ 太多連接 ” 錯(cuò)誤消息,并且想要了解發(fā)生了什么, 該聲明非常有用。MySQL保留一個(gè)額外的連接以供有權(quán)限的帳戶使用SUPER,以確保管理員始終能夠連接和檢查系統(tǒng)(假設(shè)您沒有向所有用戶授予此權(quán)限)。
線程可以用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)
所產(chǎn)生的列SHOW PROCESSLIST具有以下含義:
Id
連接標(biāo)識符,這是同一類型的在所顯示的值ID的列INFORMATION_SCHEMA.PROCESSLIST表,該P(yáng)ROCESSLIST_ID性能視圖的列threads 表,并且通過返回的 CONNECTION_ID()功能。
User
發(fā)出聲明的MySQL用戶,如果是system user,它是指由服務(wù)器產(chǎn)生的非客戶線程,以在內(nèi)部處理任務(wù)。這可能是復(fù)制從站或延遲行處理程序使用的I / O或SQL線程。unauthenticated user指的是已經(jīng)與客戶端連接關(guān)聯(lián)但是還沒有完成客戶機(jī)用戶的認(rèn)證的線程。 event_scheduler指的是監(jiān)視預(yù)定事件的線程。如果是system user那么在Host列中不會指定主機(jī) 。
Host
發(fā)出該語句的客戶端的主機(jī)名(system user沒有主機(jī)除外),以便更容易地確定哪個(gè)客戶端正在做什么,顯示方式:host_name:client_port。
db
當(dāng)前執(zhí)行語句對應(yīng)的默認(rèn)數(shù)據(jù)庫,如果選擇了;否則為NULL。
Command
顯示這個(gè)線程此刻正在執(zhí)行的命令,一般對應(yīng)DDL或DML語句。
Time
表示線程處于當(dāng)前狀態(tài)的時(shí)間長短,線程當(dāng)前時(shí)間的概念在某些情況下可能會發(fā)生改變:線程可以改變時(shí)間。對于正在從主機(jī)處理事件的從站上運(yùn)行的線程,線程時(shí)間設(shè)置為事件中發(fā)現(xiàn)的時(shí)間,因此反映了主站而不是從站的當(dāng)前時(shí)間。SET TIMESTAMP = value。
State
對應(yīng)Command指令,大多數(shù)狀態(tài)對應(yīng)于非??焖俚牟僮?。如果線程在給定狀態(tài)下保持多秒,則可能存在需要調(diào)查的問題。
Info
包含由線程執(zhí)行的語句的文本或者NULL,如果它不是執(zhí)行的話。默認(rèn)情況下,此值僅包含語句的前100個(gè)字符。要查看完整的語句,請使用SHOW FULL PROCESSLIST。
二、線程命令(Command)值
線程可以具有以下任何 Command值:
Binlog Dump:這是主服務(wù)器上的線程,用于將二進(jìn)制日志內(nèi)容發(fā)送到從服務(wù)器。
Table Dump:線程將表內(nèi)容發(fā)送到從服務(wù)器。
Change user:線程正在執(zhí)行改變用戶操作。
Close stmt:線程正在關(guān)閉準(zhǔn)備好的語句。
Connect:復(fù)制中,從服務(wù)器連接到其主服務(wù)器。
Connect Out:復(fù)制中,從服務(wù)器正在連接到其主服務(wù)器。
Create DB:線程正在執(zhí)行create-database操作。
Daemon:此線程在服務(wù)器內(nèi)部,而不是服務(wù)客戶端連接的線程。
Debug:線程正在生成調(diào)試信息。
Delayed insert:線程是一個(gè)延遲插入處理程序。
Drop DB:線程正在執(zhí)行drop-database操作。
Execute:線程正在執(zhí)行一個(gè)準(zhǔn)備好的語句(prepare statement類型就是預(yù)編譯的語句,JDBC支持次類型執(zhí)行SQL)。
Fetch:線程正在執(zhí)行一個(gè)準(zhǔn)備語句的結(jié)果。
Field List:線程正在檢索表列的信息。
Init DB:線程正在選擇默認(rèn)數(shù)據(jù)庫。
Kill:線程正在殺死另一個(gè)線程。
Long Data:該線程在執(zhí)行一個(gè)準(zhǔn)備語句的結(jié)果中檢索長數(shù)據(jù)。
Ping:線程正在處理服務(wù)器ping請求。
Prepare:線程正在為語句生成執(zhí)行計(jì)劃。
Processlist:線程正在生成有關(guān)服務(wù)器線程的信息。
Query:該線程正在執(zhí)行一個(gè)語句。
Quit:線程正在終止。
Refresh:線程是刷新表,日志或緩存,或重置狀態(tài)變量或復(fù)制服務(wù)器信息。
Register Slave:線程正在注冊從服務(wù)器。
Reset stmt:線程正在重置一個(gè)準(zhǔn)備好的語句。
Set option:線程正在設(shè)置或重置客戶端語句執(zhí)行選項(xiàng)。
Shutdown:線程正在關(guān)閉服務(wù)器。
Sleep:線程正在等待客戶端向其發(fā)送新的語句。
Statistics:線程正在生成服務(wù)器狀態(tài)信息。
Time:沒用過。
三、線程狀態(tài)(State)值
一般線程狀態(tài)(State)值
以下列表描述State 了與常規(guī)查詢處理關(guān)聯(lián)的線程值,而不是更復(fù)雜的活動,例如復(fù)制。其中許多僅用于在服務(wù)器中查找錯(cuò)誤。
After create:當(dāng)線程創(chuàng)建表(包括內(nèi)部臨時(shí)表)時(shí),會在創(chuàng)建表的函數(shù)的末尾創(chuàng)建。即使由于某些錯(cuò)誤而無法創(chuàng)建表,也會使用此狀態(tài)。
Analyzing:線程正在計(jì)算MyISAM表密鑰分布(例如:for ANALYZE TABLE)。
checking permissions:線程正在檢查服務(wù)器是否具有執(zhí)行語句所需的權(quán)限。
Checking table:線程正在執(zhí)行表檢查操作。
cleaning up:線程已經(jīng)處理了一個(gè)命令,正在準(zhǔn)備釋放內(nèi)存并重置某些狀態(tài)變量。
closing tables:線程將更改的表數(shù)據(jù)刷新到磁盤并關(guān)閉已用表。這應(yīng)該是一個(gè)快速的操作。如果沒有,請驗(yàn)證您是否沒有完整的磁盤,并且磁盤沒有被非常大的使用。
copy to tmp table:線程正在處理ALTER TABLE語句。此狀態(tài)發(fā)生在已創(chuàng)建新結(jié)構(gòu)的表之后,但是將行復(fù)制到該表之前。對于此狀態(tài)的線程,可以使用性能模式來獲取有關(guān)復(fù)制操作的進(jìn)度。
Copying to group table:如果語句具有不同ORDER BY和GROUP BY標(biāo)準(zhǔn),各行按組排列和復(fù)制到一個(gè)臨時(shí)表。
Creating index:線程正在處理ALTER TABLE … ENABLE KEYS一個(gè)MyISAM表。
Creating sort index:線程正在處理一個(gè)SELECT使用內(nèi)部臨時(shí)表解析的線程 。
creating table:線程正在創(chuàng)建一個(gè)表,這包括創(chuàng)建臨時(shí)表。
committing alter table to storage engine:服務(wù)器已經(jīng)完成就位ALTER TABLE并提交結(jié)果。
deleting from main table:服務(wù)器正在執(zhí)行多表刪除的第一部分,它僅從第一個(gè)表中刪除,并從其他(引用)表中保存要用于刪除的列和偏移量。
deleting from reference tables:服務(wù)器正在執(zhí)行多表刪除的第二部分,并從其他表中刪除匹配的行。
discard_or_import_tablespace:線程正在處理ALTER TABLE … DISCARD TABLESPACE或ALTER TABLE … IMPORT TABLESPACE聲明。
end:這發(fā)生在結(jié)束,但的清理之前ALTER TABLE, CREATE VIEW, DELETE, INSERT, SELECT,或UPDATE語句。
executing:該線程已經(jīng)開始執(zhí)行一個(gè)語句。
Execution of init_command:線程正在init_command系統(tǒng)變量的值中執(zhí)行語句 。
freeing items:線程已經(jīng)執(zhí)行了一個(gè)命令,在這種狀態(tài)下完成的項(xiàng)目的一些釋放涉及查詢緩存,這個(gè)狀態(tài)通常在后面cleaning up。
FULLTEXT initialization:服務(wù)器正在準(zhǔn)備執(zhí)行自然語言全文搜索。
init:此操作在初始化ALTER TABLE, DELETE, INSERT, SELECT, or UPDATE之前發(fā)生,服務(wù)器在該狀態(tài)中采取的操作包括刷新二進(jìn)制日志、Innodb日志和一些查詢緩存清理操作。對于最終狀態(tài), 可能會發(fā)生以下操作:更改表中的數(shù)據(jù)后刪除查詢緩存項(xiàng)、將事件寫入二進(jìn)制日志、釋放內(nèi)存緩沖區(qū), 包括blob。
Killed:執(zhí)行KILL語句,向線程發(fā)送了一個(gè)聲明,下次檢查kill標(biāo)志時(shí)應(yīng)該中斷。在MySQL的每個(gè)主循環(huán)中檢查該標(biāo)志,但在某些情況下,線程可能需要很短時(shí)間才能死掉。如果線程被某個(gè)其他線程鎖定,則一旦其他線程釋放鎖定,該kill就會生效。
Locking system tables:線程正在嘗試鎖定系統(tǒng)表(例如,時(shí)區(qū)或日志表)。
login:連接線程的初始狀態(tài),直到客戶端成功認(rèn)證為止。
manage keys:服務(wù)器啟用或禁用表索引。
NULL:該狀態(tài)用于SHOW PROCESSLIST狀態(tài)。
Opening system tables:線程嘗試打開系統(tǒng)表(例如,時(shí)區(qū)或日志表)。
Opening tables:線程正在嘗試打開一個(gè)表,這應(yīng)該是非??斓某绦?,除非有事情阻止打開。例如,一個(gè)ALTER TABLE或一個(gè)LOCK TABLE語句可以阻止打開一個(gè)表,直到語句完成。還可能需要關(guān)注table_open_cache參數(shù)的值是否足夠大。對于系統(tǒng)表,使用Opening system tables狀態(tài)。
optimizing:服務(wù)器正在執(zhí)行查詢的初始優(yōu)化。
preparing:此狀態(tài)發(fā)生在查詢優(yōu)化期間。
Purging old relay logs:線程正在刪除不需要的中繼日志文件。
query end:處理查詢之后,freeing items狀態(tài)之前會發(fā)生這種狀態(tài)。
Removing duplicates:該查詢的使用SELECT DISTINCT方式使得MySQL不能在早期階段優(yōu)化不同的操作。因此,MySQL需要一個(gè)額外的階段來刪除所有重復(fù)的行,然后將結(jié)果發(fā)送給客戶端。
removing tmp table:處理語句后,該線程正在刪除一個(gè)內(nèi)部臨時(shí)表SELECT 。如果沒有創(chuàng)建臨時(shí)表,則不使用該狀態(tài)。
rename:線程正在重命名一個(gè)表。
rename result table:線程正在處理一個(gè)ALTER TABLE語句,已經(jīng)創(chuàng)建了新表,并重新命名它來替換原始表。
Reopen tables:線程獲得了表的鎖,但在獲得基礎(chǔ)表結(jié)構(gòu)更改的鎖之后注意到。它釋放了鎖,關(guān)閉了table,并試圖重新打開它。
Repair by sorting:修復(fù)代碼正在使用排序來創(chuàng)建索引。
preparing for alter table:服務(wù)器正在準(zhǔn)備就地執(zhí)行ALTER TABLE。
Repair done:線程已經(jīng)完成了一個(gè)MyISAM表的多線程修復(fù) 。
Repair with keycache:修復(fù)代碼通過密鑰緩存逐個(gè)使用創(chuàng)建密鑰,這比慢得多Repair by sorting。
Rolling back:線程正在回滾事務(wù)。
Saving state:對于MyISAM表操作(如修復(fù)或分析),線程將新的表狀態(tài)保存到.MYI文件頭。狀態(tài)包括行數(shù), AUTO_INCREMENT計(jì)數(shù)器和鍵分布等信息。
Searching rows for update:線程正在進(jìn)行第一階段,以便在更新之前查找所有匹配的行。如果UPDATE要更改用于查找涉及的行的索引,則必須執(zhí)行此操作 。
setup:線程正在開始一個(gè)ALTER TABLE操作。
Sorting for group:線程正在做一個(gè)滿足一個(gè)GROUP BY。
Sorting for order:線程正在做一個(gè)滿足一個(gè)ORDER BY。
Sorting index:線程是排序索引頁,以便在MyISAM表優(yōu)化操作期間更有效地訪問。
Sorting result:對于一個(gè)SELECT語句,這類似于Creating sort index,但是對于非臨時(shí)表。
statistics:服務(wù)器正在計(jì)算統(tǒng)計(jì)信息以開發(fā)查詢執(zhí)行計(jì)劃。如果一個(gè)線程長時(shí)間處于這種狀態(tài),服務(wù)器可能是磁盤綁定的,執(zhí)行其他工作。
update:線程正在準(zhǔn)備開始更新表。
Updating:線程正在搜索要更新的行并正在更新它們。
updating main table:服務(wù)器正在執(zhí)行多表更新的第一部分,它僅更新第一個(gè)表,并保存用于更新其他(引用)表的列和偏移量。
updating reference tables:服務(wù)器正在執(zhí)行多表更新的第二部分,并從其他表更新匹配的行。
User lock:線程將要求或正在等待通過GET_LOCK()呼叫請求的咨詢鎖定 。因?yàn)?SHOW PROFILE,這個(gè)狀態(tài)意味著線程正在請求鎖定(不等待它)。
User sleep:線程調(diào)用了一個(gè) SLEEP()調(diào)用。
故障診斷狀態(tài)(State)值(個(gè)人提?。?/strong>
logging slow query:線程正在向慢查詢?nèi)罩緦懭胝Z句。
altering table:服務(wù)器正在執(zhí)行就地ALTER TABLE。
Receiving from client:服務(wù)器正在從客戶端讀取數(shù)據(jù)包。
Copying to tmp table:服務(wù)器正在復(fù)制磁盤到內(nèi)存的臨時(shí)表,是直接在磁盤創(chuàng)建的臨時(shí)表而并非從內(nèi)存轉(zhuǎn)到磁盤的臨時(shí)表。
Copying to tmp table on disk:對于線程將臨時(shí)表從內(nèi)存中更改為基于磁盤的格式存儲以節(jié)省內(nèi)存后,又把臨時(shí)表從磁盤復(fù)制到內(nèi)存時(shí)的狀態(tài)。
Creating tmp table:線程正在內(nèi)存或磁盤上創(chuàng)建臨時(shí)表。如果表在內(nèi)存中創(chuàng)建,但后來轉(zhuǎn)換為磁盤表,則該操作中的狀態(tài)將為Copying to tmp table on disk。
Sending data:線程正在讀取和處理SELECT語句的行,并將數(shù)據(jù)發(fā)送到客戶端。由于在此狀態(tài)期間發(fā)生的操作往往執(zhí)行大量的磁盤訪問(讀?。?,所以在給定查詢的整個(gè)生命周期內(nèi)通常是最長的運(yùn)行狀態(tài)。
Sending to client:服務(wù)器正在向客戶端寫入數(shù)據(jù)包。
Waiting for commit lock:FLUSH TABLES WITH READ LOCK正在等待提交鎖。
Waiting for global read lock:FLUSH TABLES WITH READ LOCK正在等待全局讀鎖定或read_only正在設(shè)置全局系統(tǒng)變量。
Waiting for tables:線程得到一個(gè)通知,表格的底層結(jié)構(gòu)已經(jīng)改變,需要重新打開表以獲得新的結(jié)構(gòu)。但是,要重新打開表格,必須等到所有其他線程都關(guān)閉該表。如果另一個(gè)線程已使用FLUSH TABLES或下面的語句之一:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或OPTIMIZE TABLE都會發(fā)生通知。
Waiting for table flush:線程正在執(zhí)行FLUSH TABLES并正在等待所有線程關(guān)閉它們的表,或者線程得到一個(gè)通知,表中的底層結(jié)構(gòu)已經(jīng)改變,并且需要重新打開表以獲得新的結(jié)構(gòu)。但是,要重新打開表,必須等到所有其他線程都關(guān)閉該表。如果另一個(gè)線程已使用FLUSH TABLES或下面的語句之一:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或OPTIMIZE TABLE都會發(fā)出這個(gè)通知。
Waiting for lock_type lock:服務(wù)器正在等待THR_LOCK從元數(shù)據(jù)鎖定子系統(tǒng)獲取鎖或鎖,其中l(wèi)ock_type指示鎖的類型。THR_LOCK狀態(tài)表示: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。
Writing to net:服務(wù)器正在將數(shù)據(jù)包寫入網(wǎng)絡(luò),如果一個(gè)線程長時(shí)間在執(zhí)行并且一直處于Writing to net狀態(tài),那么一直在發(fā)送數(shù)據(jù)包到網(wǎng)絡(luò),可以試著調(diào)整max_allowed_packet大小。另外,這可能會導(dǎo)致其他線程大量阻塞。
Waiting on cond:線程等待條件成為true的一般狀態(tài),沒有特定的狀態(tài)信息可用。
System lock:線程已經(jīng)調(diào)用mysql_lock_tables() ,且線程狀態(tài)從未更新。這是一個(gè)非常普遍的狀態(tài),可能由于許多原因而發(fā)生。例如, 線程將請求或正在等待表的內(nèi)部或外部系統(tǒng)鎖。當(dāng)InnoDB在執(zhí)行鎖表時(shí)等待表級鎖時(shí), 可能會發(fā)生這種情況。如果此狀態(tài)是由于請求外部鎖而導(dǎo)致的,并且不使用正在訪問相同表的多個(gè)mysqld服務(wù)器MyISAM,則可以使用該–skip-external-locking選項(xiàng)禁用外部系統(tǒng)鎖 。但是,默認(rèn)情況下禁用外部鎖定,因此這個(gè)選項(xiàng)很有可能不起作用。因?yàn)镾HOW PROFILE,這個(gè)狀態(tài)意味著線程正在請求鎖定(不等待它)。對于系統(tǒng)表,使用Locking system tables狀態(tài)。
查詢緩存狀態(tài)(State)值
checking privileges on cached query:服務(wù)器正在檢查用戶是否具有訪問緩存查詢結(jié)果的權(quán)限。
checking query cache for query:服務(wù)器正在檢查當(dāng)前查詢是否存在于查詢緩存中。
invalidating query cache entries:查詢緩存條目被標(biāo)記為無效,因?yàn)榈讓颖硪迅摹?/p>
sending cached result to client:服務(wù)器正在從查詢緩存中獲取查詢的結(jié)果,并將其發(fā)送給客戶端。
storing result in query cache:服務(wù)器將查詢結(jié)果存儲在查詢緩存中。
Waiting for query cache lock:當(dāng)會話正在等待采取查詢緩存鎖定時(shí),會發(fā)生此狀態(tài)。這種情況可能需要執(zhí)行一些查詢緩存操作,如使查詢緩存無效的INSERT或DELETE語句,以及RESET QUERY CACHE等等。
事件調(diào)度器線程狀態(tài)(State)值
這些狀態(tài)適用于事件調(diào)度程序線程,創(chuàng)建用于執(zhí)行調(diào)度事件的線程或終止調(diào)度程序的線程。
Clearing
調(diào)度程序線程或正在執(zhí)行事件的線程正在終止,即將結(jié)束。
Initialized
調(diào)度程序線程或?qū)?zhí)行事件的線程已初始化。
Waiting for next activation
調(diào)度程序具有非空事件隊(duì)列,但下一次激活是將來。
Waiting for scheduler to stop
線程發(fā)出SET GLOBAL event_scheduler=OFF并正在等待調(diào)度程序停止。
Waiting on empty queue
調(diào)度程序的事件隊(duì)列是空的,它正在休眠。
其他
除了上述幾類,還有如復(fù)制主線程狀態(tài)(State)值、復(fù)制從庫IO線程狀態(tài)(State)值、復(fù)制從庫SQL線程(State)值、復(fù)制從庫Connect線程(State)值、詳情可見:MySQL主從復(fù)制線程狀態(tài)轉(zhuǎn)變
看完了這篇文章,相信你對“MySQL中SHOW PROCESSLIST協(xié)助故障診斷全過程的示例分析”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。