1. 程式人生 > >mysql佔用伺服器cpu過高的原因以及解決辦法

mysql佔用伺服器cpu過高的原因以及解決辦法

排查方法 :

> mysql -uroot -p      #登陸資料庫

>********                    #輸入資料庫密碼

mysql> show processlist;             

show processlist 命令詳解:

processlist命令的輸出結果顯示了有哪些執行緒在執行,可以幫助識別出有問題的查詢語句。

 

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

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

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

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

     先簡單說一下各列的含義和用途,第一列,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伺服器資源(主要是cpu, 記憶體),並可能導致mysql崩潰。

解決辦法 :

mysql的配置my.ini檔案中,有一項: 

wait_timeout, 即可設定睡眠連線超時秒數,如果某個連線超時,會被mysql自然終止。 

wait_timeout過大有弊端,其體現就是MySQL裡大量的SLEEP程序無法及時釋放,拖累系統性能,不過也不能把這個指設定的過小,否則你可能會遭遇到“MySQL has gone away”之類的問題,通常來說,我覺得把wait_timeout設定為10是個不錯的選擇,但某些情況下可能也會出問題,比如說有一個CRON指令碼,其中兩次SQL查詢的間隔時間大於10秒的話,那麼這個設定就有問題了(當然,這也不是不能解決的問題,你可以在程式裡時不時mysql_ping一下,以便伺服器知道你還活著,重新計算wait_timeout時間):

mysql> show global variables like 'wait_timeout'; 

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

| Variable_name              | Value | 

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

| wait_timeout               | 120    | 

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

mysql> set global wait_timeout=100;

至此,mysql佔用cpu下降了