解決mysql獲取不到連接的問題


  應用使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM