客戶端閒置一段時間後執行查詢報錯:
ERROR 2013 (HY000): Lost connection to MySQL server during query ERROR 2006 (HY000): MySQL server has gone away
控制空閒斷開的核心參數:
| 參數 | 默認值 | 作用對象 | 定義 |
|---|---|---|---|
interactive_timeout | 28800s (8h) | 交互式連接 | 使用 CLIENT_INTERACTIVE 選項連接(如 mysql 客戶端) |
wait_timeout | 28800s (8h) | 非交互式連接 | JDBC、PHP、Python 等應用程序連接 |
連接建立瞬間,會話級 wait_timeout 根據客戶端類型繼承:
@@session.wait_timeout = @@global.interactive_timeout@@session.wait_timeout = @@global.wait_timeout實際生效的永遠是會話級 wait_timeout,interactive_timeout 僅作為交互式連接的初始值來源。
mysql> SET SESSION wait_timeout = 10; -- 等待 11 秒 mysql> SELECT 1; ERROR 2013: Lost connection
mysql> SET SESSION interactive_timeout = 10; -- 等待 11 秒 mysql> SELECT 1; -- 正常返回,連接未斷
mysql> SET GLOBAL interactive_timeout = 10; -- 新開 mysql 客戶端窗口 mysql> SHOW SESSION VARIABLES LIKE 'wait_timeout'; -- 顯示 10
mysql> SET GLOBAL wait_timeout = 20; -- 新 JDBC 連接 SELECT wait_timeout → 20 -- 等待 21 秒查詢 → 斷開
| 場景 | 建議值 | 理由 |
|---|---|---|
| 高併發短連接(PHP/Java 連接池) | wait_timeout = 300~600 (5-10min) | 快速回收空閒連接,防止連接池洩漏佔滿 max_connections |
| 長連接/持久連接場景 | wait_timeout = 3600+ | 避免業務邏輯間隙斷開,配合驗證查詢 SELECT 1 心跳 |
| 運維/手工查詢窗口 | interactive_timeout = 28800 (默認 8h) | 給 DBA 足夠操作時間,不影響應用連接 |
| 連接池驗證機制 | HikariCP idleTimeout < wait_timeout | 池層面主動剔除空閒連接,不依賴服務端踢人 |