彰化一整天的論壇

 找回密碼
 立即註冊
查看: 41|回復: 0

【轉貼】mysql sleep連線過多的完美解決辦法

[複製鏈接]
發表於 2019-9-25 11:21:31 | 顯示全部樓層 |閱讀模式
睡眠連線過多,會對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
# 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 '%timeout';  +----------------------------+-------+  | Variable_name | Value |  +----------------------------+-------+  | wait_timeout | 10 |  +----------------------------+-------+  
即可。
在我的生產環境中,使用這個辦法,取得了相當好的效果。
當然,更根本的方法,還是從以上三點排查之:
1. 程式中,不使用持久連結,即使用mysql_connect而不是pconnect。
2. 程式執行完畢,應該顯式呼叫mysql_close
3. 只能逐步分析系統的SQL查詢,找到查詢過慢的SQL,優化之


回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

 ㄚ母滴雞湯
 員林香純滴雞精

Archiver|手機版|小黑屋|彰化一整天的論壇(Excel,Office)  |网站地图

GMT+8, 2019-10-18 16:29 , Processed in 0.130215 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表