最近排查一些MySQL的問題产阱,會(huì)經(jīng)常用到 show processlist悼潭,所以在這里把這個(gè)命令總結(jié)一下,做個(gè)備忘睛挚,以備不時(shí)只需。
show processlist 是顯示用戶正在運(yùn)行的線程急黎,需要注意的是扎狱,除了 root 用戶能看到所有正在運(yùn)行的線程外,其他用戶都只能看到自己正在運(yùn)行的線程勃教,看不到其它用戶正在運(yùn)行的線程淤击。除非單獨(dú)個(gè)這個(gè)用戶賦予了PROCESS 權(quán)限。
root用戶故源,可以看到全部線程運(yùn)行情況
普通的activiti用戶只能看到自己的
單獨(dú)給activiti用戶授PROCESS權(quán)限污抬,(授權(quán)后需要退出重新登錄)
show processlist 顯示的信息都是來自MySQL系統(tǒng)庫 information_schema 中的 processlist 表。所以使用下面的查詢語句可以獲得相同的結(jié)果:
select * from information_schema.processlist
了解這些基本信息后绳军,下面我們看看查詢出來的結(jié)果都是什么意思印机。
Id: 就是這個(gè)線程的唯一標(biāo)識(shí),當(dāng)我們發(fā)現(xiàn)這個(gè)線程有問題的時(shí)候门驾,可以通過 kill 命令射赛,加上這個(gè)Id值將這個(gè)線程殺掉。前面我們說了show processlist 顯示的信息時(shí)來自information_schema.processlist 表奶是,所以這個(gè)Id就是這個(gè)表的主鍵楣责。
User: 就是指啟動(dòng)這個(gè)線程的用戶。
Host: 記錄了發(fā)送請(qǐng)求的客戶端的 IP 和 端口號(hào)诫隅。通過這些信息在排查問題的時(shí)候腐魂,我們可以定位到是哪個(gè)客戶端的哪個(gè)進(jìn)程發(fā)送的請(qǐng)求。
DB: 當(dāng)前執(zhí)行的命令是在哪一個(gè)數(shù)據(jù)庫上逐纬。如果沒有指定數(shù)據(jù)庫,則該值為 NULL 削樊。
Command: 是指此刻該線程正在執(zhí)行的命令豁生。這個(gè)很復(fù)雜,下面單獨(dú)解釋
Time: 表示該線程處于當(dāng)前狀態(tài)的時(shí)間漫贞。
State: 線程的狀態(tài)甸箱,和 Command 對(duì)應(yīng),下面單獨(dú)解釋迅脐。
Info: 一般記錄的是線程執(zhí)行的語句芍殖。默認(rèn)只顯示前100個(gè)字符,也就是你看到的語句可能是截?cái)嗔说那疵铮慈啃畔⑼憧ィ枰褂?show full processlist龟梦。
下面我們單獨(dú)看一下 Command 的值:
Binlog Dump: 主節(jié)點(diǎn)正在將二進(jìn)制日志 ,同步到從節(jié)點(diǎn)
Change User: 正在執(zhí)行一個(gè) change-user 的操作
Close Stmt: 正在關(guān)閉一個(gè)Prepared Statement 對(duì)象
Connect: 一個(gè)從節(jié)點(diǎn)連上了主節(jié)點(diǎn)
Connect Out: 一個(gè)從節(jié)點(diǎn)正在連主節(jié)點(diǎn)
Create DB: 正在執(zhí)行一個(gè)create-database 的操作
Daemon: 服務(wù)器內(nèi)部線程窃躲,而不是來自客戶端的鏈接
Debug: 線程正在生成調(diào)試信息
Delayed Insert: 該線程是一個(gè)延遲插入的處理程序
Drop DB: 正在執(zhí)行一個(gè) drop-database 的操作
Execute: 正在執(zhí)行一個(gè) Prepared Statement
Fetch: 正在從Prepared Statement 中獲取執(zhí)行結(jié)果
Field List: 正在獲取表的列信息
Init DB: 該線程正在選取一個(gè)默認(rèn)的數(shù)據(jù)庫
Kill : 正在執(zhí)行 kill 語句计贰,殺死指定線程
Long Data: 正在從Prepared Statement 中檢索 long data
Ping: 正在處理 server-ping 的請(qǐng)求
Prepare: 該線程正在準(zhǔn)備一個(gè) Prepared Statement
ProcessList: 該線程正在生成服務(wù)器線程相關(guān)信息
Query: 該線程正在執(zhí)行一個(gè)語句
Quit: 該線程正在退出
Refresh:該線程正在刷表,日志或緩存蒂窒;或者在重置狀態(tài)變量躁倒,或者在復(fù)制服務(wù)器信息
Register Slave: 正在注冊(cè)從節(jié)點(diǎn)
Reset Stmt: 正在重置 prepared statement
Set Option: 正在設(shè)置或重置客戶端的 statement-execution 選項(xiàng)
Shutdown: 正在關(guān)閉服務(wù)器
Sleep: 正在等待客戶端向它發(fā)送執(zhí)行語句
Statistics: 該線程正在生成 server-status 信息
Table Dump: 正在發(fā)送表的內(nèi)容到從服務(wù)器
Time: Unused
如果有歧義可以查看官方文檔: 8.14.1 Thread Command Values
下面我們看看 State 的值有哪些:
...... 發(fā)現(xiàn)有大神已經(jīng)總結(jié)的超好了:MySQL SHOW PROCESSLIST協(xié)助故障診斷
...... 所以大家直接看大神的文章就好了。好尷尬洒琢,但我是個(gè)有始有終的人秧秉,就醬紫吧。
官方文檔關(guān)于 State 的解釋: 8.14.2 General Thread States
下面是常用到的SQL衰抑,記錄下來便于使用象迎。
按客戶端 IP 分組,看哪個(gè)客戶端的鏈接數(shù)最多
select client_ip,count(client_ip) as client_num from (select substring_index(host,':' ,1) as client_ip from processlist ) as connect_info group by client_ip order by client_num desc;
查看正在執(zhí)行的線程停士,并按 Time 倒排序挖帘,看看有沒有執(zhí)行時(shí)間特別長(zhǎng)的線程
select * from information_schema.processlist where Command != 'Sleep' order by Time desc;
找出所有執(zhí)行時(shí)間超過 5 分鐘的線程,拼湊出 kill 語句恋技,方便后面查殺
select concat('kill ', id, ';') from information_schema.processlist where Command != 'Sleep' and Time > 300 order by Time desc;
后面拇舀,還有什么發(fā)現(xiàn),在繼續(xù)更新蜻底。