首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 連線頻繁失敗排查:從 mysql_connect 到連線池的演進與優化

     編輯:MySQL 資料庫相關知識

現象

Warning: mysql_connect(): Can't connect to MySQL server on 'xx.xx.xx.xx' (4)

虛擬主機環境,流量恢復後頻率從週 1-2 次升為天天發生,重啟暫時緩解。

根因分析

  1. 短連線風暴:每頁多次 mysql_connect()/mysql_close(),高併發下耗盡作業系統連線隊列與 MySQL max_connections。
  2. 未釋放資源:迴圈中重複查詢未關閉結果集,導致連線洩漏。
  3. 虛擬主機資源配額:共享主機對單用戶連線數、進程數有硬性限制。

演進嘗試

  • mysql_pconnect()(持久連線):暫時緩解半個月,但連線池滿時仍失效,且共享主機常禁用持久連線。
  • 優化 SQL:減少每頁查詢數、消除迴圈查詢(用 JOIN/IN 合併)。

徹底解決方案

1. 應用層連線池

# PHP 可用 mysqli 持久連線 + 連線池庫(如 php-pool)
# 或升級框架(Laravel/ThinkPHP 內建連線池)

2. 架構層:獨立資料庫實例 / 雲資料庫

虛擬主機共享 MySQL 無法根治,建議遷移至雲資料庫(RDS/CloudSQL)或自建 VPS,獨享 max_connections、記憶體、CPU。

3. 程式碼層檢查清單

  • 單一請求只建立一個連線,複用 $link 變數。
  • 所有查詢用 mysqli_query($link, $sql) 傳入連線資源。
  • 迴圈查詢 → 改寫為單一 JOIN 或 WHERE IN。
  • 關閉結果集:mysqli_free_result($res)。
  • 請求結束統一 mysqli_close($link)(持久連線可省略)。

監控指標

  • Threads_connected、Max_used_connections / max_connections 使用率。
  • Aborted_connects 急增預警。
  • 慢查詢日誌分析 Top 10 SQL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved