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

MySQL 查詢超時參數詳解與調優指南:wait_timeout vs interactive_timeout

     編輯:MySQL 綜合教學

核心超時參數一覽

mysql> SHOW VARIABLES LIKE '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 5     |
| delayed_insert_timeout     | 300   |
| interactive_timeout        | 28800 |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| wait_timeout               | 28800 |
+----------------------------+-------+

關鍵參數深度解析

wait_timeout(非互動連線空閒斷線)

  • 適用對象:非 CLIENT_INTERACTIVE 模式的連線(如 JDBC、PHP PDO、連線池)
  • 預設值:28800 秒(8 小時)
  • 生效方式:SET GLOBAL wait_timeout = 3600;(新連線生效)或配置檔永久生效

interactive_timeout(互動式連線空閒斷線)

  • 適用對象:啟用 CLIENT_INTERACTIVE 模式的連線(如 mysql 命令列客戶端、MySQL Workbench)
  • 關係:連線建立時若帶 CLIENT_INTERACTIVE,wait_timeout 會被設為 interactive_timeout 的值
  • PHP 範例:
    $link = mysqli_connect($host, $user, $pwd, $db, 3306, NULL, MYSQLI_CLIENT_INTERACTIVE);

常見問題與解決方案

問題 1:應用報錯 "MySQL server has gone away"

原因:連線池借用的連線空閒超過 wait_timeout 被伺服器主動斷開,應用再次使用時發現連線失效。

解決:

  1. 縮短連線池 idleTimeout < wait_timeout(如 HikariCP 設定 maxLifetime=30min)
  2. 啟用連線池 validationQuery(SELECT 1)借用前檢測
  3. 調大 wait_timeout(如 86400 秒),但需評估連線數壓力

問題 2:長時間運行的批次作業中斷

原因:單條 SQL 執行超過 net_read_timeout/net_write_timeout,或事務間隙空閒超過 wait_timeout。

解決:會話級調大 SET SESSION net_read_timeout = 300;,或拆分長事務。

生產環境建議配置

[mysqld]
# 非互動連線 1 小時斷開,配合連線池 maxLifetime=30min
wait_timeout = 3600
interactive_timeout = 3600
# 網路讀寫超時 5 分鐘,防長查詢卡死
net_read_timeout = 300
net_write_timeout = 300
# 連線建立超時 10 秒
connect_timeout = 10

驗證指令

-- 查看當前會話實際生效值
SHOW SESSION VARIABLES LIKE '%timeout';
-- 查看全域設定
SHOW GLOBAL VARIABLES LIKE '%timeout';

延伸閱讀

  • MySQL 查詢快取機制簡介
  • 使用 MySQL 聯集避免順序儲存
  • 5 種常見的 MySQL 日誌類型
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved