MySQL Too many connections 錯誤解決(2026)|max_connections 設定與連線數爆滿排除

MySQL Too many connections 完整解決教學|連線數超過上限排查與修復(2026)
錯誤訊息:
Too many connections

MySQL Too many connections 是資料庫最常見的連線錯誤之一,代表目前連線數已達上限,新連線無法建立。 這個問題常出現在高流量網站、API 系統、電商平台或未正確釋放連線的應用程式中。

許多使用者會誤以為只要調整 max_connections 就能解決,但實際上真正原因通常來自應用層設計不良或查詢行為不佳。 本篇將從「設定 + 架構 + 除錯」三個面向完整解析。

一、MySQL Too many connections 發生原因

  • max_connections 設定過低
  • 網站或 API 沒有釋放資料庫連線
  • 瞬間流量暴增(流量尖峰)
  • 長時間執行 SQL 未結束
  • 程式使用錯誤的 connection pooling
👉 MySQL 預設 max_connections 約 151,對現代網站通常偏低

二、快速修復

💡 正式環境正在出狀況,需要馬上處理:伺服器正卡在連線爆滿、使用者連不上的當下,優先用下面的 SET GLOBAL 立即解除,不要急著去重啟 MySQL——重啟本身需要時間,反而會讓服務多中斷一段時間。

方法一:立即生效,不需要重啟(建議優先使用)

mysql -u root -p
SET GLOBAL max_connections = 300;

max_connections 是 MySQL 的動態變數,用 SET GLOBAL 指令修改會對之後新建立的連線立即生效,完全不需要重啟 MySQL,可以在流量尖峰當下直接解除連線爆滿的緊急狀況。

⚠️ 注意:這樣修改只存在記憶體裡,MySQL 重啟後這個設定會消失,恢復成設定檔裡的原始值。如果要讓這個數值長期保留,請接著做下面的「永久保留設定」。

方法二:永久保留設定(MySQL 8.0 可一步到位)

如果你的 MySQL 是 8.0 以上版本,可以用 SET PERSIST 指令,一次同時做到「立即生效」與「寫入永久設定、未來重啟也不會跑掉」,不需要額外編輯設定檔或重啟:

SET PERSIST max_connections = 300;

如果是 MySQL 8.0 以前的版本沒有 SET PERSIST,則需要手動把設定寫進設定檔,讓它在未來重啟後依然保留:

/etc/my.cnf.d/server.cnf
[mysqld]
max_connections = 300

這種情況下,設定檔的變更要等到下一次系統重啟才會被讀取套用;但前面方法一的 SET GLOBAL 已經讓目前執行中的 MySQL 立即生效了,不需要為了讓設定檔生效而現在去重啟服務——除非你本來就有其他原因需要重啟。

🔍 檢查是否生效

mysql -u root -p
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
✔ Threads_connected 可以觀察目前即時連線數

三、進階排查(真正問題常在這裡)

🔍 查看目前連線

SHOW PROCESSLIST;

⚠️ 常見問題來源

  • PHP / CodeIgniter 未正確關閉 DB connection
  • API 每次 request 都建立新連線
  • 背景排程(cron job)未釋放連線
  • 查詢時間過長導致連線堆積
👉 如果只調 MySQL,但程式沒修,問題一定會再發生

四、最佳優化策略(工程師建議)

  • 使用 connection pooling(連線池)
  • 避免 persistent connection 濫用
  • 優化 SQL 執行時間
  • 加快 API response time
✔ 核心觀念:不是「增加連線」,而是「減少浪費連線」

延伸閱讀(MySQL 錯誤排除系列・2026)

FAQ 常見問題

MySQL Too many connections 是什麼意思?
代表資料庫連線數已達上限,新連線無法建立,通常因 max_connections 太低或流量過高造成。
調整 max_connections 就能解決嗎?
只能暫時緩解,如果應用程式沒有正確釋放連線,問題仍會再次發生。
預設 max_connections 是多少?
MySQL 預設約 151,對高流量網站通常不夠用。
會影響網站嗎?
會,當連線滿時網站將無法存取資料庫,導致服務中斷。
如何找出佔用連線的程式?
使用 SHOW PROCESSLIST 可以查看目前所有連線與執行狀態。
CodeIgniter 會造成這問題嗎?
如果沒有正確關閉 DB connection,確實可能導致連線累積。
提高 max_connections 有風險嗎?
有,過高會增加 RAM 使用量,每個連線都會占用資源。
最佳解決方式是什麼?
優化 SQL + 控制應用程式連線 + 適度調整 max_connections,而不是單純調高數值。
這個錯誤常見嗎?
非常常見,特別是在流量成長或未做連線管理的系統中。
修改 max_connections 一定要重啟 MySQL 嗎?
不一定。max_connections 是動態變數,用 SET GLOBAL 指令修改會立即生效、不需要重啟。只有單純修改 my.cnf 設定檔而不搭配 SET GLOBAL 或 SET PERSIST 時,才需要重啟才能套用;MySQL 8.0 可用 SET PERSIST 一個指令同時做到立即生效與永久保留。

這是 MySQL 錯誤排除系列文章之一,包含記憶體、連線、鎖定三大類問題。