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

PHP 定時腳本清理 MySQL Sleep 死連接:原理、代碼與部署全流程

     編輯:MySQL 資料庫相關知識

問題背景

MySQL 出現大量 Sleep 狀態連接,Time 持續增長,佔滿 max_connections 導致新連接被拒。調優參數無效,需主動清理。

解決方案:PHP 監控腳本 + Cron 定時執行

核心代碼 kill-mysql-sleep-proc.php


 MAX_SLEEP_TIME) {
        $kill_id = (int)$proc["Id"];
        mysqli_query($conn, "KILL $kill_id");
        error_log("Killed sleep process ID: $kill_id, Time: {$proc['Time']}");
    }
}
mysqli_close($conn);
?>

改進點:使用 mysqli 替代棄用的 mysql 擴展;強制類型轉換 (int) 防注入;記錄日志便於審計。

部署:Crontab 每 2 分鐘執行


# 編輯 crontab
crontab -e

# 添加行(路徑根據實際調整)
*/2 * * * * /usr/bin/php /usr/local/sbin/kill-mysql-sleep-proc.php >> /var/log/kill-mysql-sleep.log 2>&1

根因治理建議(治標不治本)

  1. 應用層修復:檢查代碼確保所有路徑正確 close() 連接,使用連接池復用而非頻繁創建/銷毀。
  2. 配置優化:
    • wait_timeout / interactive_timeout = 60-120(自動斷開閒置連接)
    • max_connections 適度增大(配合內存)
    • 啟用 thread_cache_size 減少線程創建開銷
  3. 監控告警:Threads_connected / Max_used_connections 閾值告警,而非依賴定時 Kill。
  4. 識別來源:SHOW PROCESSLIST 中 Host/Info 定位具體應用/接口,針對性修復。

總結

定時 Kill 腳本是緊急止血手段,核心在於應用層連接管理規範化 + 服務端超時保護 + 監控體系三位一體治本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved