客戶端連接被服務端主動斷開,或客戶端主動放棄連接。非單一原因,需按場景排查。
| # | 成因 | 典型場景 | 排查/解決 |
|---|---|---|---|
| 1 | 空閒超時 | 連接池連接閒置超過 `wait_timeout` (默認 8h) | 調大 `wait_timeout` / 連接池啟用 `testOnBorrow` / 定時心跳 |
| 2 | 連接被 KILL | DBA 手動 `KILL` / 自動化巡檢腳本誤殺 | 監控 `Com_kill` 狀態變量;審核自動化腳本邏輯 |
| 3 | 客戶端超時 | 驅動配置 `readTimeout`/`writeTimeout` 過小,大查詢/大結果集觸發 | 調大驅動超時參數 (如 JDBC `socketTimeout`、Python `connect_timeout`) |
| 4 | 封包過大 | SQL/結果集 > `max_allowed_packet` (默認 16MB/4MB/64MB 視版本) | 客戶端/服務端**同步調大** `max_allowed_packet` (如 256M) |
| 5 | DNS 反解失敗 | `skip_name_resolve=OFF` 且 DNS 故障/慢 | 設 `skip_name_resolve=ON` (僅 IP 連接) / 修復 DNS |
| 6 | 多進程共用連接 | Python `multiprocessing` / PHP `pcntl_fork` 子進程繼承父進程連接並發操作 | **子進程重新建立連接**;連接池不可跨進程共享 |
| 7 | 實例 Crash/重啟 | MySQL 進程異常退出並自動恢復 (Uptime 重置) | 監控 `Uptime` 突變;啟用 `log_warnings=2` 記錄詳細錯誤日誌 |
-- 啟動參數添加 (MySQL 5.7+)
[mysqld]
log_warnings = 2 -- 或 log_error_verbosity = 3 (8.0+)
-- 驗證實例存活
SHOW GLOBAL STATUS LIKE 'Uptime';
Error Log 將記錄:`Aborted connection X to db: '...' user: '...' host: '...' (Got an error reading communication packets)` 等詳細碼。
發生 gone away │ ├─ 檢查 Uptime 是否重置 → 是 → 實例重啟 (原因7) │ ├─ 檢查 Error Log 是否有 Killed → 是 → 被殺 (原因2) │ ├─ 檢查最後活動時間 - 當前 > wait_timeout → 是 → 空閒斷開 (原因1) │ ├─ 檢查 SQL/結果集大小 > max_allowed_packet → 是 → 封包過大 (原因4) │ ├─ 檢查客戶端驅動超時設置 → 過小 → 客戶端超時 (原因3) │ ├─ 檢查是否 Fork/多進程 → 是 → 共用連接 (原因6) │ └─ 以上皆否 → 懷疑 DNS/網絡抖動 (原因5) → 開 log_warnings=2 深究