本文首發:
MySQL 連接配接數過多的處理方法合集 - Too many connections - 卡拉雲碰到
Can not connect to MySQL server. Too many connections”-mysql
錯誤着實令人抓狂。這基本等于失去了對 MySQL 的控制權。本教程将詳細講解多種處理此錯誤的方法。
sudo mysql -uroot -p
ERROR 1040 (00000): Too many connections
本教程将分這幾個來講解此類錯誤的原因。
- 如何檢視 MySQL 連接配接狀态?
- 如何檢視目前 MySQL 連接配接池是否已滿?
- 限制逾時時間的方法,縮短 sleep 時間,使系統更快回收連接配接。
- 修改配置檔案中最大連接配接數的方法,保證連接配接暢通。
- 火線救援法,不用重新開機,不用登入 MySQL,即可修改最大連接配接數。
- 提前布局,給 root 預留好連接配接通道。
一. 錯誤原因
出現 MySQL 連接配接數過多有多種情況,多數是因為
mysql_connect
,沒有
mysql_close
; 當
sleep
連接配接占滿最大連接配接數
max_connections
時,會導緻
Too many connections
錯誤。
MySQL 預設最大連接配接數
max_connections
為 151,其實 MySQL 還給 root 留了多一個通道,真正的最大連接配接數為
max_connections + 1
。但實際工作中因為各種原因,這個 1 也有可能被占用。這時,我們無法通過登入 MySQL 調整參數的方法來處理這個錯誤。
二. 檢視目前 MySQL 連接配接情況
我們可以使用
SHOW PROCESSLIST;
檢視前 100 條連接配接。
SHOW PROCESSLIST;
也可以使用
SHOW full PROCESSLIST;
檢視所有連接配接。
SHOW full PROCESSLIST;
上圖中 ID 15 的連接配接 我們可以看到它已經 11388s
擴充閱讀:《
如何使用 MySQL 慢查詢日志進行性能優化》
三. 如何檢視目前 MySQL 連接配接池是否已滿?
使用
mysqladmin -u kalacloud -p status
檢視目前連接配接數情況
将
kalacloud
替換為你的 MySQL 賬号名稱,在傳回的結果中,
Threads
的值為目前連接配接數,如果目前連接配接數接近或等于最大連接配接數,那麼就說明 MySQL 連接配接數已經滿了或接近滿了。
MySQL 觸發器的建立、使用、檢視、删除教程及應用場景實戰案例四. 合理設定逾時時間
之是以會出現大量
sleep
占滿連接配接,除了業務量的原因外,也有可以從逾時時間着手調整,可根據實際情況适當縮短逾時時間,讓 MySQL 可在短時間自動清理逾時連接配接,以達到保證連接配接通常的目的。
mysqld
連接配接逾時參數有以下兩個:
預設情況下,兩者都是 28800 秒(8 小時),我們可以在 MySQL 配置檔案中修改這兩個參數。
如果你使用的是
mysql_pconnect
這種持久連接配接的話,可以将逾時時間降到更合适的值,比如 600 (10 分鐘)甚至 60(1 分鐘)。這個逾時時間并沒有一個明确的時間,主要還是要看你的應用場景中的實際需求。
1.在配置檔案中修改逾時時間(需重新開機 MySQL 生效):
首先打開
mysqld.cnf
配置檔案。
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
然後在配置檔案中找到這兩行,并修改對應的參數:
[mysqld]
interactive_timeout=60
wait_timeout=60
MySQL 配置檔案詳解 2.臨時變更連接配接逾時時間(無需重新開機):
SET GLOBAL interactive_timeout = 60;
SET GLOBAL wait_timeout = 60;
注意:
- 這是臨時變更配置的方法,在重新開機 MySQL 後會恢複配置檔案中的設定值。
- 對于已經打開的連接配接,是不會被關閉的。隻有建立立的連接配接才會在 60 秒後關閉。
五. 檢視及修改最大連接配接數
在 MySQL 中,預設連接配接數為 151,我們可以通過修改 MySQL 配置檔案永久調整連接配接數參數,也可以通過 SQL 指令臨時調整。
1.檢視目前 MySQL 連接配接數
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.01 sec)
mysql>
2.臨時調整目前 MySQL 連接配接數
set GLOBAL max_connections = 300;
3.通過修改 MySQL 配置檔案調整最大連接配接數
首先打開 MySQL 配置檔案:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld] 下面找到
max_connections
,如果沒有可直接添加。
[mysqld]
...
max_connections = 300
...
修改後重新開機 MySQL,使配置檔案生效:
sudo systemctl restart mysql
重新開機後,進入 MySQL ,我們可以看到最大連接配接數配置已經生效。
mysql> show variables like '%max_connections%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| max_connections | 300 |
| mysqlx_max_connections | 100 |
+------------------------+-------+
2 rows in set (0.02 sec)
mysql>
MySQL 配置檔案 my.cnf / my.ini 逐行詳解 六. 無法登入 MySQL 時,如何修改最大連接配接數
在無法登入又無法重新開機 MySQL 時,我們可以使用以下方法進行操作,以增大連接配接數。
1.修改 pid 增大連接配接數
我們可以使用 gdb 工具,在不進入資料庫的情況下,修改最大連接配接數。
gdb -p $(cat data/kalacloud.pid)
-ex "set max_connections=5000" -batch
-
:将這裡修改為你伺服器中data/kalacloud.pid
的檔案路徑及檔案名。pid
此方法僅适用于特殊、緊急情況,在生産環境使用,有一定風險,慎用。
七. 提前布局,防患于未然
在 MySQL 配置檔案中,有兩個有關連接配接數的參數
-
:控制最大連接配接數。max_connections
-
:控制單個使用者的最大連接配接數。當此參數為 100 時,那麼任意使用者(含 root 使用者)最多可建立 100 個連接配接。max_user_connections
制定連接配接政策:
max_connections = 2000
max_user_connections= 300
當 MySQL 有 6 個使用者時(不含 root ),單個使用者最大連接配接數為 300,那麼 6 個使用者最多有 1800 連接配接。那麼系統總會剩下 200 個連接配接留給 root 使用。
六. 總結
有關 MySQL 連接配接數過多的錯誤,我們要在平時的工作中多實踐,這裡的很多關鍵參數都需要我們對手中的工作有更宏觀的認識,才能更好的設定這些參數。
最後推薦以下卡拉雲,卡拉雲是一套低代碼開發工具,可一鍵接入包括 MySQL 在内的常見資料庫及 API,無需懂任何前端,隻需要簡單拖拽,即可快速搭建企業内部工具。數月的開發工作量,使用卡拉雲後可縮減至數天,免費試用
卡拉雲。
卡拉雲可一鍵接入市面上常見的資料庫及 API
有關 MySQL 教程,可繼續拓展學習: