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