SHOW VARIABLES LIKE '%timeout%' 返回 12 個超時參數,令人眼花繚亂。本文逐一解析每個參數的含義、生效階段、默認值、實驗驗證方法與調優建議,構建完整的 MySQL 超時參數知識圖譜。
| 參數名 | 默認值 | 單位 | 作用階段 | 核心含義 |
|---|---|---|---|---|
| connect_timeout | 10 | 秒 | 握手認證 | 等待客戶端發送握手包的超時 |
| delayed_insert_timeout | 300 | 秒 | INSERT DELAYED | 延遲插入線程等待插入的超時 |
| innodb_flush_log_at_timeout | 1 | 秒 | InnoDB 刷盤 | 日誌刷盤間隔 (配合 innodb_flush_log_at_trx_commit) |
| innodb_lock_wait_timeout | 50 | 秒 | 行鎖等待 | InnoDB 事務等待行鎖超時 |
| innodb_rollback_on_timeout | OFF | 布爾 | 鎖超時回滾 | 鎖超時是否回滾整個事務 (ON) 或僅當前語句 (OFF) |
| interactive_timeout | 28800 | 秒 (8h) | 空閒斷開 | 交互式客戶端 (mysql CLI) 空閒斷開時間 |
| lock_wait_timeout | 31536000 | 秒 (1年) | 元數據鎖 | MDL (Metadata Lock) 等待超時,DDL/FLUSH TABLES 等 |
| net_read_timeout | 30 | 秒 | 網絡讀取 | Server 讀取客戶端數據超時 (如 LOAD DATA 大文件) |
| net_write_timeout | 60 | 秒 | 網絡發送 | Server 發送數據給客戶端超時 (大結果集) |
| rpl_stop_slave_timeout | 31536000 | 秒 (1年) | 複製停止 | STOP SLAVE 等待從線程結束超時 |
| slave_net_timeout | 3600 | 秒 (1h) | 複製網絡 | 從庫等待主庫數據超時 |
| wait_timeout | 28800 | 秒 (8h) | 空閒斷開 | 非交互式客戶端 (應用連接池) 空閒斷開時間 |
TCP 三次握手完成後,Server 等待客戶端發送認證包的時間。5.0.52 前默認 5s,後默認 10s。
# 實驗:telnet 連接不發數據,10s 後斷開
telnet localhost 3306
# SHOW PROCESSLIST 顯示: Command=Connect, State=Reading from net, Time 遞增至 10 後消失
wait_timeout 會話變量:
mysql -u -p、CLIENT_INTERACTIVE 标志) → wait_timeout = interactive_timeoutwait_timeout = 全局 wait_timeoutERROR 2006 (HY000): MySQL server has gone away# 實驗:設置 3 秒驗證
SET GLOBAL interactive_timeout=3;
-- 重新登入 mysql CLI,3 秒無操作後執行任意命令觸發重連
ERROR 1205 (HY000): Lock wait timeout exceededinnodb_rollback_on_timeout=OFF (默認):**僅回滾當前語句**,事務保持開啟innodb_rollback_on_timeout=ON:**回滾整個事務**# 實驗驗證
-- Session 1
BEGIN; SELECT * FROM t WHERE id=2 FOR UPDATE; -- 持有鎖
-- Session 2 (設置 1 秒)
SET SESSION innodb_lock_wait_timeout=1;
BEGIN; DELETE FROM t WHERE id=2; -- 1 秒後報 1205
-- OFF: SELECT * FROM t 仍見 id=1,3 (第一條 DELETE 成功未回滾)
-- ON: 整個事務回滾
LOCK TABLES、FLUSH TABLES WITH READ LOCK、HANDLER 都需 MDL# 實驗:MyISAM 表演示
-- Session 1
START TRANSACTION; SELECT * FROM myisam_t; -- 持有 MDL
-- Session 2
DROP TABLE myisam_t; -- 阻塞至 lock_wait_timeout 後報 1205
-- 觸發 MDL 的操作:
DROP TABLE; ALTER TABLE; LOCK TABLES WRITE; FLUSH TABLES WITH READ LOCK
net_read_timeout:Server 讀取客戶端請求數據超時 (如 LOAD DATA INFILE 大文件、慢客戶端)net_write_timeout:Server 發送結果集超時 (大查詢結果、慢網絡)Reading from net / Writing to net# 實驗:LOAD DATA 大文件中途斷網
iptables -A INPUT -p tcp --dport 3306 -j DROP
# 連接狀態 Reading from net,net_read_timeout 後斷開
┌─────────────────────────────────────────────────────────────┐
│ MySQL 連接生命週期 │
├──────────────┬──────────────────────┬───────────────────────┤
│ 握手認證階段 │ 空閒等待階段 │ 忙碌處理階段 │
│ (Authentication) │ (Idle / Sleep) │ (Query / Busy) │
├──────────────┼──────────────────────┼───────────────────────┤
│ connect_timeout │ interactive_timeout │ net_read_timeout │
│ │ wait_timeout │ net_write_timeout │
│ │ │ innodb_lock_wait_timeout│
│ │ │ lock_wait_timeout │
└──────────────┴──────────────────────┴───────────────────────┘
| 場景 | 參數調整 | 理由 |
|---|---|---|
| 應用連接池頻繁報 "server has gone away" | 檢查 wait_timeout < 連接池驗證間隔;建議 wait_timeout ≥ 8h,連接池啟用 validationQuery | 連接池借出連接前未驗證,Server 已斷開空閒連接 |
| 大批量 LOAD DATA 導入失敗 | net_read_timeout = 300-600 (視文件大小/網速) | 默認 30s 易超時 |
| 大結果集查詢客戶端超時 | net_write_timeout = 300-600;客戶端同步調大 socket timeout | Server 發送慢於網絡/客戶端處理 |
| 高併發業務頻發 Lock wait timeout | innodb_lock_wait_timeout = 5-10 (縮短等待、快速失敗重試);優化索引減少鎖衝突 | 長等待佔用線程、加劇雪崩 |
| DDL 執行長期阻塞業務 | lock_wait_timeout = 30-60;使用 pt-online-schema-change / gh-ost 在線 DDL | MDL 阻塞所有寫入,甚至讀取 |
| 從庫複製頻繁中斷 | slave_net_timeout = 60-300;檢查主從網絡、主庫負載 | 默認 1h 過長,故障發現慢 |
# HikariCP / Druid / DBCP 關鍵配置
# 1. 空閒驗證 (核心)
validationQuery: SELECT 1
testWhileIdle: true
timeBetweenEvictionRunsMillis: 30000
minEvictableIdleTimeMillis: 600000 -- 10 分鐘
# 2. 連接存活時間 < wait_timeout
# 建議: maxLifetime = wait_timeout - 30 分鐘 (如 7.5h)
# 3. 獲取連接超時
connectionTimeout: 30000 -- 30 秒
# 4. 最大/最小閒置
maximumPoolSize: 20-50 (視 CPU 核心、業務 QPS)
minimumIdle: 5-10
12 個 Timeout 參數覆蓋 握手 (connect_timeout) → 空閒 (wait_timeout/interactive_timeout) → 忙碌 (net_read/write, innodb_lock_wait, lock_wait) 三大生命週期階段。調優核心原則:**連接池驗證機制 > 依賴 Server 端超時**;**業務超時預期 < Server 端超時**;**監控 PROCESSLIST State 分佈 (Sleep/Reading from net/Writing to net/Locked) 精準定位超時類別**。