MySql使用show processlist查看正在執行的Sql語句


今天上班例行的查看了下服務器的運行狀況,發現服務器特卡,是mysqld這個進程占用CPU到了99%導致的。

比較好奇是那個程序在使用mysql導致cpu這么高的,通過show processlist命令查看了當前正在執行的sql語句,從而定位到了對應的程序,發現代碼中有一個死循環在不停的查詢導致cpu占用99%,原因找到了問題就好解決了。

 

這里簡單的記錄一下processlist的用法:

processlist 命令的輸出結果顯示了有哪些線程在運行,可以幫助識別出有問題的查詢語句,兩種方式使用這個命令。

1.        進入 mysql/bin 目錄下輸入 mysqladmin processlist;

2.        啟動 mysql ,輸入 show processlist;

如果有 SUPER 權限,則可以看到全部的線程,否則,只能看到自己發起的線程(這是指,當前對應的 MySQL 帳戶運行的線程)。

得到數據形式如下(只截取了三 條):

mysql> show processlist;

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

| Id | User  | Host             | db    | Command | Time| State      | Info                                                                                            

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

|207|root  |192.168.0.20:51718 |mytest | Sleep     | 5     |          | NULL                                                                                                  

|208|root  |192.168.0.20:51719 |mytest | Sleep    | 5    |          | NULL        

|220|root  |192.168.0.20:51731 |mytest |Query    | 84   | Locked  |

select bookname,culture,value,type  from book where id=001

先簡單說一下各列的含義和用途,第一列, id , 不用說了吧,一個標識,你要 kill 一個語句的時候很有用。 user列, 顯示單前用戶,如果不是 root ,這個命令就只顯示你權限范圍內的 sql 語 句。 host 列,顯示這個語句是從哪個 ip 的哪 個端口上發出的。呵呵,可以用來追蹤出問題語句的用戶。 db 列,顯示這個進程目前連接的是 哪個數據庫 。command 列,顯示當前連接的執行的命令,一般就是休眠( sleep ),查詢( query ),連接( connect )。 time 列,此這個狀態持續的時間,單位是秒。 state 列,顯示使用當前連接的 sql 語句的狀態,很重要的列,后續會有所有的狀態的描述,請注意, state 只是語句執行中的某一個狀態,一個 sql 語 句,已查詢為例,可能需要經過 copying to tmp table ,Sorting result , Sending data 等狀態才 可以完成, info 列,顯示這個 sql 語 句,因為長度有限,所以長的 sql 語句就顯示不全,但是一個判斷問題語句的重要依據。

 

當MySQL繁忙的時候運行show processlist,會發現有很多行輸出,每行輸出對應一個MySQL連接。怎么診斷發起連接的進程是哪個?它當前正在干嘛呢?

首先,需要通過TCP Socket而不是Unix Socket連接MySQL,這樣在show processlist的輸出中就會有來源端口號。如下,

mysql> show processlist;
+——–+——–+—————–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——–+——–+—————–+——+———+——+——-+——————+
| 277801 | mydbuser | localhost:35558 | mydb | Sleep | 1 | | NULL |
| 277804 | mydbuser | localhost:35561 | mydb | Sleep | 1 | | NULL |
| 277805 | mydbuser | localhost:35562 | mydb | Sleep | 0 | | NULL |
+——–+——–+—————–+——+———+——+——-+——————+

在Host列有來源IP和端口號,然后我們從連接機器查看端口號是誰打開的,

[root@localhost ~]# netstat -ntp | grep 35558
… 124.115.0.68:35558 ESTABLISHED 18783/httpd

可知進程18783發起的MySQL連接來源端口是35558,然后就可以用strace觀察這個進程了。如果是Apache的PHP腳本,還可以 用proctitle模塊( http://pecl.php.net/package/proctitle/ )設置腳本的狀態信息。

lsof也能根據端口號顯示進程號,細節請參考手冊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM