too many connections 解決方法


最近寫javaee項目的時候,mysql報了too many connections的錯誤,百度的內容有一些有問題,所以我重新寫一下我的解決方法。

mysql -u root -p 回車輸入密碼進入mysql 

 

這里寫圖片描述

show processlist;

查看連接數,可以發現有很多連接處於sleep狀態,這些其實是暫時沒有用的,所以可以kill掉

show variables like "max_connections";

查看最大連接數,應該是與上面查詢到的連接數相同,才會出現too many connections的情況

set GLOBAL max_connections=1000;

修改最大連接數,但是這不是一勞永逸的方法,應該要讓它自動殺死那些sleep的進程。

show global variables like 'wait_timeout';

這個數值指的是mysql在關閉一個非交互的連接之前要等待的秒數,默認是28800s

set global wait_timeout=300;

修改這個數值,這里可以隨意,最好控制在幾分鍾內

這里寫圖片描述

set global interactive_timeout=500;

修改這個數值,表示mysql在關閉一個連接之前要等待的秒數,至此可以讓mysql自動關閉那些沒用的連接,但要注意的是,正在使用的連接到了時間也會被關閉,因此這個時間值要合適

批量kill之前沒用的sleep連接,在網上搜索的方法對我都不奏效,因此只好使用最笨的辦法,一個一個kill

select concat('KILL ',id,';') from information_schema.processlist where user='root'; 先把要kill的連接id都查詢出來

復制中間的kill id;內容到word文檔
替換掉符號“|”和回車符(在word中查詢^p即可查詢到回車符)
把修改過的內容復制回終端,最后按回車執行!

ERROR 1040: Too many connections問題解決辦法

 

出現此錯誤的原因,一種是訪問量確實很高,MySQL服務器頂不住,這個時候就要考慮增加從服務器分散讀壓力,另外一種情況是MySQL配置文件中max_connections值過小。

 

分析原因

mysql的默認連接上只有100,也就是說連接數據超過100 就會有可能出現 Too Many Connections

修改my.cnf配置文件添加並需要重啟:

[mysqld]


wait_timeout = 600
interactive_timeout = 600

查詢MySQL的最大連接數:

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 100 |
+-----------------+-------+
1 row in set (0.00 sec)

查詢MySQL響應的最大連接數:

mysql> show global status like 'max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 5 |
+----------------------+-------+
1 row in set (0.00 sec)

說明:本地環境沒什么參考價值,但是就上面的數據而言,MySQL過去所響應的最大連接數小於其允許的最大連接數,所以不會出現1040錯誤。
MySQL比較理想的最大連接數計算方式為:

max_used_connections / max_connections * 100% ≈ 85%

即最大連接數占上限連接數的85%左右,如果發現比例在10%以下,MySQL服務器連接數上限設置的過高了。

問題找到解決辦法

 

1、mysql -u root -p 進入不了,同樣出現上述錯誤。

 

2、修改/etc/mysql/my.cnf(ubuntu系統,其他系統在/etc/my.cnf

[mysqld] 
port=3306 
#socket=MySQL 
skip-locking 
set-variable = key_buffer=16K 
set-variable = max_allowed_packet=1M 
set-variable = thread_stack=64K 
set-variable = table_cache=4 
set-variable = sort_buffer=64K 
set-variable = net_buffer_length=2K 
set-variable = max_connections=1000

 

3、重啟

 

代碼如下 復制代碼

mysql /etc/init.d/mysql restart

 

搞定了。

 

總結

 

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

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

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

 


免責聲明!

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



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