若是你沒有修改過MySQL的配置,缺省狀況下,wait_timeout的初始值是28800。
wait_timeout 過大有弊端,其體現就是MySQL裏大量的SLEEP進程沒法及時釋放,拖累系統性能,不過也不能把這個指設置的太小,不然你可能會遭遇到「MySQL has gone away」之類的問題,一般來講,我以爲把wait_timeout設置爲10是個不錯的選擇,但某些狀況下可能也會出問題,好比說有一個CRON腳本,其中兩次SQL查詢的間隔時間大於10秒的話,那麼這個設置就有問題了(固然,這也不是不能解決的問題,你能夠在程序裏時不時mysql_ping一下,以便服務器知道你還活着,從新計算wait_timeout時間):
# vi /etc/my.cnf
[mysqld]
wait_timeout=10
# /etc/init.d/mysql restart
不過這個方法太生硬了,線上服務重啓不管如何都應該儘量避免,看看如何在MySQL命令行裏經過SET來設置:
mysql> set global wait_timeout=10;
mysql> show global variables like 'wait_timeout';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| wait_timeout | 10 |
+----------------------------+-------+
這裏一個容易把人搞蒙的地方是若是查詢時使用的是show variables的話,會發現設置好像並無生效,這是由於單純使用show variables的話就等同於使用的是show session variables,查詢的是會話變量,只有使用show global variables,查詢的纔是全局變量。
網絡上不少人都抱怨說他們set global以後使用show variables查詢沒有發現改變,緣由就在於混淆了會話變量和全局變量,若是僅僅想修改會話變量的話,可使用相似set wait_timeout=10;或者set session wait_timeout=10;這樣的語法。
另外一個值得注意的是會話變量wait_timeout初始化的問題,這一點在手冊裏已經明確指出了,我就直接拷貝了:
On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value, depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect()).
MySQL大拿Jeremy Zawodny曾在他的文章Fixing Poor MySQL Default Configuration Values裏面列出了幾個很噁心的MySQL缺省設置,不過沒包含wait_timeout,但我以爲它也應該算一個,每次新裝MySQL後最好都記得修改它。
參考文章2
睡眠鏈接過多,會對mysql服務器形成什麼影響?
嚴重消耗mysql服務器資源(主要是cpu, 內存),並可能致使mysql崩潰。
形成睡眠鏈接過多的緣由?
1. 使用了太多持久鏈接(我的以爲,在高併發系統中,不適合使用持久鏈接)
2. 程序中,沒有及時關閉mysql鏈接
3. 數據庫查詢不夠優化,過分耗時。
那麼,若是要從根本上解決sleep鏈接過多,就得從以上三點反覆檢查,可是見效並不快。
網上有人分享,使用shell腳本配合cron,按期殺死睡眠時間過久的鏈接,可是這種方法很是不可取,典型的以暴制暴,極可能致使數據崩潰,並且,還須要編寫相應shell, 設置cron, 實施成本較繁瑣,不推薦使用。
那麼更好的辦法應該是讓mysql本身決定這些睡眠鏈接的命運,實施會更簡單,有效。
mysql的配置文件中,有一項:
wait_timeout, 便可設置睡眠鏈接超時秒數,若是某個鏈接超時,會被mysql天然終止,多好的辦法!
如設置:
wait_timeout=100 #即設置mysql鏈接睡眠時間爲100秒,任何sleep鏈接睡眠時間若超過100秒,將會被mysql服務天然終止,要比編寫shell腳本更簡單。
那麼,對於正在運行中的生產服務器,在不能中止服務狀況下,修改此項怎麼辦?很簡單,以root用戶登陸到mysql,執行:
set global wait_timeout=100
便可。
在個人生產環境中,使用這個辦法,取得了至關好的效果。
固然,更根本的方法,仍是從以上三點排查之:
1. 程序中,不使用持久連接,即便用mysql_connect而不是pconnect。
2. 程序執行完畢,應該顯式調用mysql_close
3. 只能逐步分析系統的SQL查詢,找到查詢過慢的SQL,優化之