Too many connections解決方案

1、緣由:
my.ini 中設定的併發鏈接數太少或者系統繁忙致使鏈接數被佔滿。
鏈接數超過了 MySQL 設置的值,與 max_connections 和 wait_timeout 都有關。
wait_timeout 的值越大,鏈接的空閒等待就越長,這樣就會形成當前鏈接數越大。mysql

2、解決方式:
打開 MYSQL 安裝目錄打開 my.ini 找到 max_connections 默認是 100, 通常設置到500~1000比較合適,重啓 MySQL。sql

顯示哪些線程正在運行
show full processlist;服務器

Command狀態描述:
1. SLEEP
線程正在等待客戶端發送新的請求。併發

2. QUERY
線程正在執行查詢或者正在將結果發送給客戶端。
 
3. LOCKED
在MYSQL服務層,該線程正在等待表鎖。在存儲引擎級別實現的鎖,如INNODB的行鎖,並不會體如今線程狀態中。 對於MYISAM來講這是一個比較典型的狀態。但在其餘沒有行鎖的引擎中也常常會出現。 性能

4. ANALYZING AND STATISTICS
線程正在收集存儲引擎的統計信息, 並生成查詢的執行計劃。spa

5. COPYING TO TMP TABLE (ON DISK)
線程正在執行查詢, 而且將其結果集都複製到一個臨時文件中, 這種狀態通常要麼是在作GROUP BY操做,要麼是文件排序操做, 或者是UNION操做。 若是這個狀態後面還有ON DISK的標 , 那表示MYSQL正在將一個內存臨時表放到磁盤上。線程

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

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

3、鏈接數設置多少是合理的?
查看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%

4、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; #設置

5、interactive_time
指的是mysql在關閉一個交互的鏈接以前所要等待的秒數
set global interactive_timeout=300;

mysql終端查看timeout的設置
show global variables like '%timeout%';

6、總結
MySQL服務器所支持的最大鏈接數是有上限的,由於每一個鏈接的創建都會消耗內存,所以客戶端在鏈接到MySQL Server處理完相應的操做後,應該斷開鏈接並釋放佔用的內存。

若是MySQL Server有大量的閒置鏈接,不只會白白消耗內存,並且若是鏈接一直在累加而不斷開,最終確定會達到MySQL Server的鏈接上限數,這會報'too many connections'的錯誤。

對於wait_timeout的值設定,應該根據系統的運行狀況來判斷。在系統運行一段時間後,能夠經過show processlist命令查看當前系統的鏈接狀態,若是發現有大量的sleep狀態的鏈接進程,則說明該參數設置的過大,能夠進行適當的調整小些。

相關文章
相關標籤/搜索