首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL Sleep 連接堆積排查與解決:wait_timeout 參數最佳實踐

     編輯:MySQL 綜合教學

現象:SHOW PROCESSLIST 顯示大量 Sleep

大量 Sleep 連接

連接數逼近 max_connections,新請求報 Too many connections。

三大根因(官方文檔)

  1. 客戶端未調用 mysql_close():代碼路徑異常退出、連接池洩漏、長連接未歸還
  2. 閒置超過 wait_timeout/interactive_timeout:客戶端掛起、網絡中斷未被檢測(類似 TCP 半開連接)
  3. 客戶端發送請求後未讀取結果即退出:TCP 三次握手視角的「發送端關閉,接收端未讀取」

快速止血:調小 wait_timeout

動態生效(無需重啟)

SET GLOBAL wait_timeout = 300;  -- 5 分鐘,視業務調整

持久化配置 (my.cnf)

[mysqld]
wait_timeout = 300
interactive_timeout = 300  -- 交互式客戶端 (mysql 命令行等) 同步調整

根治方案:應用層連接池治理

問題檢查點修正措施
連接洩漏代碼所有路徑是否 finally { close() }使用 try-with-resources / using / defer 確保釋放
連接池配置不當maxPoolSize、idleTimeout、maxLifetimeidleTimeout < wait_timeout,maxLifetime < 8h
長事務/慢查詢佔用連接慢查詢日誌、事務耗時監控拆分長事務、優化慢 SQL、設置 statement timeout
防火牆/網絡設備斷開閒置連接TCP keepalive、防火牆超時啟用連接池 testOnBorrow/testWhileIdle、TCP keepalive

監控告警建議

  • 關鍵指標:Threads_connected / max_connections > 70% 告警
  • Sleep 連接佔比 > 50% 且持續增長 → 立即排查應用端
  • 定期 SHOW PROCESSLIST 統計 Sleep 時長分佈

參數值選擇參考

調小 wait_timeout 是**止血藥**,連接池治理才是**根治藥**。生產環境建議:wait_timeout=300 + 連接池 idleTimeout=180 + maxLifetime=1800 + 啟用驗證查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
業務類型建議 wait_timeout理由
高頻短連接 (PHP 等)60-300s快速回收,防洩漏放大
連接池長連接 (Java/Go 等)300-600s配合池 idleTimeout=180s、maxLifetime=30min
交互式分析28800s (8h)interactive_timeout 獨立設置