Mysql show processlist 排查問題

一、命令概述:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章