在mysql中運行SHOW PROCESSLIST;,現資料庫中有很多這樣的進程:
其實就是MySQL中Sleep串連過多,那麼造成sleep的原因,有三個,下面是mysql手冊給出的解釋:
1.用戶端程式在退出之前沒有調用mysql_close().[寫程式的疏忽,或者資料庫的db類庫沒有自動關閉每次的串連。。。]
2.用戶端sleep的時間在wait_timeout或interactive_timeout規定的秒內沒有發出任何請求到伺服器. [類似常連,類似於不完整的tcp ip協議構造,服務端一直認為用戶端仍然存在(有可能用戶端已經斷掉了)]
3.用戶端程式在結束之前向伺服器發送了請求還沒得到返回結果就結束掉了. [參看:tcp ip協議的三向交握]
解決的方法也很簡單
在設定檔中加入
[mysqld]
wait_timeout=10
或者
mysql> set global wait_timeout=10;
MySQL sleep串連過多的完美解決辦法
睡眠串連過多,會對mysql伺服器造成什麼影響?
嚴重消耗mysql伺服器資源(主要是cpu, 記憶體),並可能導致mysql崩潰。
造成睡眠串連過多的原因? www.2cto.com
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而不是mysql_pconnect。
2. 程式執行完畢,應該顯式調用mysql_close
3. 只能逐步分析系統的SQL查詢,找到查詢過慢的SQL,最佳化之.