有時候你在mysql中執行show processlist;後會發現資料庫中有很多這樣的程序:
那麼造成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伺服器造成什麼影響?
嚴重消耗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而不是mysql_
pconnect。
2. 程式執行完畢,應該顯式呼叫mysql_close
3. 只能逐步分析系統的sql查詢,找到查詢過慢的sql,優化之
mysql sleep連線過多的完美解決辦法
睡眠連線過多,會對mysql伺服器造成什麼影響?嚴重消耗mysql伺服器資源 主要是cpu,記憶體 並可能導致mysql崩潰。造成睡眠連線過多的原因?1.使用了太多持久連線 個人覺得,在高併發系統中,不適合使用持久連線 2.程式中,沒有及時關閉mysql連線 3.資料庫查詢不夠優化,過度耗時。那麼,...
mysql sleep連線過多的完美解決辦法
睡眠連線過多,會對mysql伺服器造成什麼影響?嚴重消耗mysql伺服器資源 主要是cpu,記憶體 並可能導致mysql崩潰。造成睡眠連線過多的原因?1.使用了太多持久連線 個人覺得,在高併發系統中,不適合使用持久連線 2.程式中,沒有及時關閉mysql連線 3.資料庫查詢不夠優化,過度耗時。那麼,...
MySQL sleep連線過多的完美解決辦法
mysql sleep連線過多的完美解決辦法 睡眠連線過多,會對mysql伺服器造成什麼影響?嚴重消耗mysql伺服器資源 主要是cpu,記憶體 並可能導致mysql崩潰。造成睡眠連線過多的原因?www.2cto.com 1.使用了太多持久連線 個人覺得,在高併發系統中,不適合使用持久連線 2.程式...