ERROR 1040 (HY000): Too many connections 表示當前連線數已達 max_connections 上限。根本原因通常有二:
wait_timeout 過長導致閒置連線堆積。# /etc/my.cnf
[mysqld]
max_connections = 1000
wait_timeout = 300 # 閒置 5 分鐘自動斷開,防洩漏
interactive_timeout = 300
# 可選:限制單一用戶最大連線,防單點佔滿
max_user_connections = 200
修改後 systemctl restart mysqld 生效。
利用 gdb 附掛到運行中的 mysqld 進程,直接修改記憶體中的全域變數:
gdb -p $(cat /var/run/mysqld/mysqld.pid) \
-ex "set max_connections=500" -batch
驗證:
mysql -e "SHOW VARIABLES LIKE 'max_connections';"
# +-----------------+-------+
# | Variable_name | Value |
# +-----------------+-------+
# | max_connections | 500 |
# +-----------------+-------+
原理: max_connections 屬於動態全域變數(SET GLOBAL 生效),但若配置檔未同步修改,重啟後會還原。緊急調大後務必同步更新 my.cnf。
Percona Server 5.5+ 內建 thread_pool 提供兩個參數:
extra_port(預設 10086):額外監聽埠,僅供管理員連線extra_max_connections(預設 1):該埠允許的最大連線數即使主埠連線已滿,管理員仍可透過 mysql -P 10086 -u root -p 進入執行 KILL 或調整參數。強烈建議啟用並設定 extra_max_connections=5 以上。
# 關鍵參數
maximumPoolSize = 30 # 應用實例數 × 此值 < max_connections
minimumIdle = 5
idleTimeout = 300000 # 5 分鐘,配合 wait_timeout
maxLifetime = 1800000 # 30 分鐘強制換新,防驅動端殘留
connectionTimeout = 5000 # 獲取連線超時 5 秒,快速失敗
將「一連線一執行緒」改為「池化工作執行緒」,大幅降低高併發下的上下文切換開銷,單機可支撐 5,000+ 併發連線。
mysqld_exporter 采集 Threads_connected / max_connectionsThreads_connected / max_connections > 0.8 觸發預警,> 0.95 觸發緊急處理Data source rejected establishment of connection
message from server: "Too many connections"
at com.mysql.jdbc.MysqlIO.checkErrorPacket...
除了上述資料庫端調整,應用端必須:
@Transactional 正確宣告,避免長事務佔住連線。close()」的手動 JDBC 代碼。server.xml 中 <Resource> 設定 maxTotal、maxIdle、removeAbandoned=true。innodb_log_file_size 變更導致無法啟動調整 innodb_log_file_size 後,必須先停庫、刪除舊 ib_logfile*,再啟動:
systemctl stop mysqld
rm -f /var/lib/mysql/ib_logfile*
systemctl start mysqld
否則 InnoDB 啟動時檢測到 redo log 大小不符會直接中止。