應用使用mysql的過程中。提示獲取不到數據庫連接。
例如:
Connections could not be acquired from the underlying database!
Cannot obtain a new connection
...
通過命令:
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-connections
http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeout
http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_interactive_timeout