Too many connections解決方案


 

原因:

   my.ini 中設定的並發連接數太少或者系統繁忙導致連接數被占滿。

  連接數超過了 MySQL 設置的值,與 max_connections 和 wait_timeout  都有關。

  wait_timeout 的值越大,連接的空閑等待就越長,這樣就會造成當前連接數越大。

解決方式:

打開 MYSQL 安裝目錄打開 my.ini 找到 max_connections 默認是 100, 一般設置到500~1000比較合適,重啟 MySQL 

顯示哪些線程正在運行

show full processlist;


狀態:
1. SLEEP
線程正在等待客戶端發送新的請求。
2. QUERY
線程正在執行查詢或者正在將結果發送給客戶端。 
3. LOCKED
在MYSQL服務層,該線程正在等待表鎖。在存儲引擎級別實現的鎖,如INNODB的行鎖,並不會體現在線程狀態中。 對於MYISAM來說這是一個比較典型的狀態。但在其他沒有行鎖的引擎中也經常會出現。 
4. ANALYZING AND STATISTICS
線程正在收集存儲引擎的統計信息, 並生成查詢的執行計划。
5. COPYING TO TMP TABLE (ON DISK)
線程正在執行查詢, 並且將其結果集都復制到一個臨時文件中, 這種狀態一般要么是在做GROUP BY操作,要么是文件排序操作, 或者是UNION操作。 如果這個狀態后面還有ON DISK的標 , 那表示MYSQL正在將一個內存臨時表放到磁盤上。

6. SORTING RESULT
線程正在對結果集進行排序。

7. SENDING DATA
線程可能在多個狀態之間傳送數據,或者生成結果集,或者在向客戶端返回數據。

  

連接數設置多少是合理的?

查看mysql的最大連接數:

 show variables like '%max_connections%';

查看服務器響應的最大連接數:

 show global status like 'Max_used_connections';

服務器響應的最大連接數為3,遠低於mysql服務器允許的最大連接數值

對於mysql服務器最大連接數值的設置范圍比較理想的是:服務器響應的最大連接數值占服務器上限連接數值的比例值在10%以上,如果在10%以下,說明mysql服務器最大連接上限值設置過高。

Max_used_connections / max_connections * 100% = 3/512 *100% ≈ 0.6%

wait_timeout

wait_timeout — 指的是mysql在關閉一個非交互的連接之前所要等待的秒數

如果你沒有修改過MySQL的配置,wait_timeout的初始值是28800

wait_timeout 過大有弊端,其體現就是MySQL里大量的SLEEP進程無法及時釋放,拖累系統性能,不過也不能把這個指設置的過小,否則你可能會遭遇到“MySQL has gone away”之類的問題

查看

 show global variables like 'wait_timeout';  

設置

set global wait_timeout=100;  

interactive_time

— 指的是mysql在關閉一個交互的連接之前所要等待的秒數 

set global  interactive_timeout=300;

 

mysql終端查看timeout的設置

show global variables like '%timeout%'; 

總結

MySQL服務器所支持的最大連接數是有上限的,因為每個連接的建立都會消耗內存,因此客戶端在連接到MySQL Server處理完相應的操作后,應該斷開連接並釋放占用的內存。

如果MySQL Server有大量的閑置連接,不僅會白白消耗內存,而且如果連接一直在累加而不斷開,最終肯定會達到MySQL Server的連接上限數,這會報'too many connections'的錯誤。

對於wait_timeout的值設定,應該根據系統的運行情況來判斷。在系統運行一段時間后,可以通過show processlist命令查看當前系統的連接狀態,如果發現有大量的sleep狀態的連接進程,則說明該參數設置的過大,可以進行適當的調整小些。

 


免責聲明!

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



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