Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

MySQL 自動關閉、連線限制、閒置斷線三大問題完整解決方案

編輯:關於伺服器

問題一:連線數耗盡導致服務拒絕

現象

`Too many connections`、應用程式無法建立新連線、錯誤日誌顯示連線數達上限。

解決:調大核心連線參數

[mysqld]
max_connections = 5000          # 預設 151,視記憶體/負載調整
max_user_connections = 4000     # 單用戶上限,防單一應用佔滿
max_connect_errors = 100000     # 避免因錯誤嘗試導致 Host 被封鎖

配合 `mysqladmin variables` 確認生效,重啟 MySQL 服務。

問題二:閒置連線 8 小時自動斷開 (wait_timeout)

根因

預設 `wait_timeout = 28800` 秒 (8小時)。連線閒置超過此值,MySQL 主動斷開,導致連線池/持久連線應用報錯 (Communications link failure / Connection reset)。

三種解決方案 (依優先序)

方案 1:調整 MySQL 參數 (治標,有上限)

[mysqld]
wait_timeout = 31536000         # 1 年 (秒)
interactive_timeout = 31536000  # 互動式客戶端同步調整
  • Linux: `/etc/my.cnf` 或 `/etc/mysql/my.cnf`
  • Windows: `my.ini`
  • **注意**:無法設為無限大 (0 表無限制但在某版本無效),極大值仍有理論上限

方案 2:JDBC 連線字串啟用自動重連 (治本,Java 應用首選)

jdbc:mysql://host:3306/schema?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
  • 驅動程式偵測連線失效時自動重建,對應用透明
  • 需確認驅動版本支援 (Connector/J 5.1.13+ 穩定支援)

方案 3:連線池層面驗證連線有效性 (通用最穩)

以 Proxool 為例 (`proxool.xml`):

<proxool>
  <alias>mysql</alias>
  <driver-url>jdbc:mysql://localhost/yourDB?useUnicode=true&characterEncoding=UTF-8</driver-url>
  <driver-class>com.mysql.jdbc.Driver</driver-class>
  <house-keeping-sleep-time>90000</house-keeping-sleep-time>  <!-- 90 秒檢查一次 -->
  <maximum-new-connections>20</maximum-new-connections>
  <minimum-connection-count>3</minimum-connection-count>
  <maximum-connection-count>20</maximum-connection-count>
  <house-keeping-test-sql>SELECT 1</house-keeping-test-sql>  <!-- 關鍵:定期驗證 -->
  <test-before-use>true</test-before-use>                    <!-- 借用前驗證 -->
  <test-after-use>true</test-after-use>                     <!-- 歸還後驗證 -->
</proxool>

其他連線池 (HikariCP、Druid、DBCP2、Tomcat JDBC Pool) 同理需啟用:

  • `validationQuery` / `connectionTestQuery` = `SELECT 1`
  • `testOnBorrow` = `true`
  • `testOnReturn` = `true`
  • `testWhileIdle` = `true`

問題三:MySQL 服務異常終止無自動重啟

Windows 服務層面設定自動恢復

  1. `services.msc` → 找到 `MySQL` / `MySQLxx` 服務 → 右鍵「內容」
  2. 「復原」頁籤:
  3. 「第一次失敗」→ **「重新啟動服務」** (預設為「無操作」)
  4. 「重新啟動服務:__ 分鐘後」→ 填 **`0`** (立即重啟)
  5. 第二次/後續失敗同樣設定
  6. 確定套用

驗證:工作管理員結束 `mysqld.exe`,觀察服務自動拉起 (PID 變化)。

Linux 系統級守護進程建議

# systemd (現代發行版)
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=notify
ExecStart=/usr/sbin/mysqld
Restart=always
RestartSec=5
StartLimitInterval=60
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

綜合最佳實務清單

層面關鍵設定驗證方式
MySQL 核心max_connections、wait_timeout、interactive_timeout`SHOW VARIABLES LIKE '%timeout%'; SHOW STATUS LIKE 'Threads_connected';`
應用/連線池autoReconnect / validationQuery / testOnBorrow / testWhileIdle模擬殺掉 DB 進程,觀察應用自動恢復無報錯
作業系統服務Windows: 服務復原=重啟(0分) / Linux: systemd Restart=always`systemctl kill -s 9 mysqld` 或 Task Manager 結束進程
監控告警Threads_connected / max_connections 比率 > 80% 告警、服務重啟事件告警Prometheus + Grafana / Zabbix / Datadog

結語

MySQL 穩定運行三板斧:**核心參數給足余量、連線池務必驗證有效性、服務層面配置自動重啟**。單靠調大 `wait_timeout` 是治標不治本;**連線池驗證機制 (testOnBorrow + testWhileIdle) 才是通用、穩健、跨語言的終極解法**。

Copyright © Windows教程網 All Rights Reserved