原因:
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狀態的連接進程,則說明該參數設置的過大,可以進行適當的調整小些。
