一、命令概述:
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