一、命令概述:
mysql show full processlist 用來查看當前線程處理情況,具體信息請參考官網:https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html
show full processlist 返回的結果是實時變化的,是對mysql鏈接執行的現場快照,所以用來處理突發事件非常有用。
一般用到 show processlist
或 show full processlist
都是爲了查看當前 mysql 是否有壓力,都在跑什麼語句,當前語句耗時多久了,有沒有什麼慢 SQL 正在執行之類的
可以看到總共有多少鏈接數,哪些線程有問題(time是執行秒數,時間長的就應該多注意了),然後可以把有問題的線程 kill 掉,這樣可以臨時解決一些突發性的問題。
有時候一個快照可能看不出什麼問題,那麼可以頻發的刷新試試
二、命令詳解:
下面來看一下運行:show full processlist命令的詳解,我們可以通過三種方式來查看命令運行的結果:
1、通過SHOW FULL PROCESSLIST命令查看:
mysql> SHOW FULL PROCESSLIST\G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 1030455
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 1004
State: Has read all relay log; waiting for the slave
I/O thread to update it
Info: NULL
*************************** 3. row
2、通過查詢鏈接線程相關的表來查看快照
select id, db, user, host, command, time, state, info
from information_schema.processlist
order by time desc
3、通過navicat中的【工具】=> 【服務器監控】進行查看結果如下:
下面針對每列做下介紹:
Id:鏈接mysql 服務器線程的唯一標識,可以通過kill來終止此線程的鏈接。
User:當前線程鏈接數據庫的用戶
Host:顯示這個語句是從哪個ip 的哪個端口上發出的。可用來追蹤出問題語句的用戶
db: 線程鏈接的數據庫,如果沒有則爲null
Command: 顯示當前連接的執行的命令,一般就是休眠或空閒(sleep),查詢(query),連接(connect)
Time: 線程處在當前狀態的時間,單位是秒
State:顯示使用當前連接的sql語句的狀態,很重要的列,後續會有所有的狀態的描述,請注意,state只是語句執行中的某一個狀態,一個 sql語句,已查詢爲例,可能需要經過copying to tmp table,Sorting result,Sending data等狀態纔可以完成
Info: 線程執行的sql語句,如果沒有語句執行則爲null。這個語句可以使客戶端發來的執行語句也可以是內部執行的語句
由於Command的狀態大部分都是sleep對我們分析問題沒什麼作用,所以我們可以通過如下語句來排除sleep狀態的線程:
-- 查詢非 Sleep 狀態的鏈接,按消耗時間倒序展示,自己加條件過濾
select id, db, user, host, command, time, state, info
from information_schema.processlist
where command != 'Sleep'
order by time desc
這樣就過濾出來哪些是正在幹活的,然後按照消耗時間倒敘展示,排在最前面的,極大可能就是有問題的鏈接了,然後查看 info 一列,就能看到具體執行的什麼 SQL 語句了,針對分析
三、kill 使用
通過前面的查詢,我們查到了問題sql,通常會kill掉這個鏈接的線程,具體看官網文檔:https://dev.mysql.com/doc/refman/5.7/en/kill.html
執行語句如下:
-- 查詢執行時間超過2分鐘的線程,然後拼接成 kill 語句
select concat('kill ', id, ';')
from information_schema.processlist
where command != 'Sleep'
and time > 2*60
order by time desc
在下一步我就不用說了吧,把拼接 kill 的執行結果跑一遍就搞定了,這個有時候非常好用,誰用誰知道
四、常見問題
一些問題會導致連鎖反應,而且不太好定位,有時候以爲是慢查詢,很可能是大多時間是在等在CPU、內存資源的釋放,所以有時候同一個查詢消耗的時間有時候差異很大
總結了一些常見問題:
- CPU報警:很可能是 SQL 裏面有較多的計算導致的
- 連接數超高:很可能是有慢查詢,然後導致很多的查詢在排隊,排查問題的時候可以看到”事發現場“類似的 SQL 語句一大片,那麼有可能是沒有索引或者索引不好使,可以用:
explain
分析一下 SQL 語句
參考:
https://xu3352.github.io/mysql/2017/07/08/msyql-show-full-processlist
https://my.oschina.net/mkh/blog/298036