Mysql show processlist 排查問題

weixin_34120274發表於2016-07-17

一、命令概述:

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

 

相關文章