解決MySQL中Sleep串連過多的問題

來源:互聯網
上載者:User

在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,最佳化之.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.