前言
有時我們需要去查mysql內部的執行情況時,要在mysql中查詢進程,需要用到show processlist或者show full processlist兩條命令。那么我們會發現,大部分的命令,其狀態都是sleep的。
我們去查sleep的進程,本質上是沒啥用的。所以,我們最好可以過濾掉sleep的進程,然后去檢查有用的信息。
正文
鑒於show processlist和show full processlist是去查詢information_schema庫的processlist表,所以我們先看一下它的結構。
各個字段解釋如下:
- ID: sql語句的id
- USER: 執行sql語句的用戶
- HOST: 在哪台機上執行的
- DB: 在哪個數據庫執行的
- COMMAND: 什么類型的sql語句,例如是查詢(query),休眠(sleep),或者后台常駐(daemon)
- TIME: 耗時多久
- Info: 語句的具體內容
於是我們如果要查詢非sleep的語句,則需要使得COMMAND項不等於'sleep'。
所以,我們可以這樣寫sql語句:
SELECT * FROM information_schema.processlist WHERE command != 'Sleep'\G;
當然,我們也可以添加其他的選項,例如對time進行修改、對user進行控制等。例如下面這個sql:
SELECT * FROM information_schema.processlist WHERE command != 'Sleep' and time>1 and user <> 'system user' and user <> 'replicator' order by time\G; #查找狀態不是sleep,非系統用戶和集群同步用戶,執行時間大於1s的sql,按照時間長短由長到短進行排序
當然如果要kill掉某個進程,可直接在mysql中kill ID即可。
例如,我要kill掉ID號為1000的sql,那么我可以直接:
kill 1000;
即可。