標籤:
應用使用mysql的過程中。提示擷取不到資料庫連接。
例如:
Connections could not be acquired from the underlying database!
通過命令:
show status where Variable_name = ‘Connections‘
查看mysql當前的串連,發現用得差不多了。
在研發環境,很多台機器使用一個資料庫的情況,或者網路不穩定的情況, 這種問題尤其明顯。
原因:
- mysql的connection是有限的。預設connection數量只有1024。
- 一般現在的應用都使用串連池管理資料庫串連。甚至會用到讀寫分離,分庫分表。導致一個應用啟動就使用100來個資料庫連結了。
- 如果網路抖動等原因,應用到mysql的連結被斷開了。應用會向mysql重新申請connection。然後之前的connection應用已經不再管了, 但是mysql會等待一個較長的時間,才釋放已經不再使用的connection。
解決connection不足問題:
重啟mysql。 這不是一個好辦法,研發測試環境可以這樣子玩玩, 生產環境肯定是不可以這樣子的。
最大串連數調大。 mysql預設的串連數只有1024。把串連數調大, 可以很有效緩解這個問題。在mysql的主要設定檔my.cnf中, 找到並且修改:
max_connections = 2048
執行後重啟mysql。
等待時間調小 上面說到,mysql會等待一段時間,才釋放已經無用的connection的。我們可以調小這值。 先執行命令, 查看一下等待時間:
show variables like "%timeout%"
所示:
預設是28800秒,8小時。。。我們把這2個值調小即可。在mysql命令列中輸入(或者navicate等工具都可以):
set global wait_timeout=60;set global interactive_timeout=60;
如果在navicate中執行上述命令, 需要關閉當前資料庫連接,才看到生效的。
生產環境完善監控 為了避免線上出現這種問題, 對mysql監控要加上當前串連數這個項,超過一定閥值就要警示。
參考:http://stackoverflow.com/questions/4284194/terminating-idle-mysql-connectionshttp://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeouthttp://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_interactive_timeout
解決mysql擷取不到串連的問題