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 |
+----------------------------+-------+
CLIENT_INTERACTIVE 模式的連線(如 JDBC、PHP PDO、連線池)SET GLOBAL wait_timeout = 3600;(新連線生效)或配置檔永久生效CLIENT_INTERACTIVE 模式的連線(如 mysql 命令列客戶端、MySQL Workbench)CLIENT_INTERACTIVE,wait_timeout 會被設為 interactive_timeout 的值$link = mysqli_connect($host, $user, $pwd, $db, 3306, NULL, MYSQLI_CLIENT_INTERACTIVE);
原因:連線池借用的連線空閒超過 wait_timeout 被伺服器主動斷開,應用再次使用時發現連線失效。
解決:
idleTimeout < wait_timeout(如 HikariCP 設定 maxLifetime=30min)validationQuery(SELECT 1)借用前檢測wait_timeout(如 86400 秒),但需評估連線數壓力原因:單條 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';