ERROR 2006 (HY000): MySQL server has gone away 是應用開發中最常見的連接異常錯誤。本文系統分析六大核心成因,提供分層修復方案與預防最佳實踐。
| 錯誤代碼 | 符號常量 | 含義 |
|---|---|---|
| 2006 | CR_SERVER_GONE_ERROR | 客戶端檢測到服務端連接已斷開 |
| 2013 | CR_SERVER_LOST | 查詢過程中連接丟失(通常伴隨 2006) |
wait_timeout (默認 8 小時/28800 秒) 或 interactive_timeoutmax_allowed_packet 限制mysqld restarted、Out of memory、Assertion failurejournalctl -u mysqld、dmesg | grep -i mysqlERROR [MY-012592] Out of memory 或 Disk is full writing# 1. 連接池配置驗證機制 (HikariCP 示例)
spring.datasource.hikari:
connection-timeout: 30000
idle-timeout: 300000 # 5分鐘 < wait_timeout
max-lifetime: 1200000 # 20分鐘 < wait_timeout
connection-test-query: SELECT 1
validation-timeout: 5000
minimum-idle: 5
maximum-pool-size: 20
# 2. 重試機制 (Spring Retry / Resilience4j)
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 1000))
public void executeWithRetry() { ... }
# 3. 連接有效性檢查
// MyBatis
[mysqld]
# 1. 增加超時時間 (根據業務評估)
wait_timeout = 28800
interactive_timeout = 28800
# 2. 增大數據包限制 (大字段業務必須)
max_allowed_packet = 256M
# 3. 連接錯誤容忍
max_connect_errors = 100000
# 4. 禁用 DNS 反向解析 (加速連接、避免解析卡頓)
skip-name-resolve
# 5. 內存相關 (防 OOM)
innodb_buffer_pool_size = 8G # 物理內存 60-80%
tmp_table_size = 256M
max_heap_table_size = 256M
idle_timeout > MySQL wait_timeoutnet.ipv4.tcp_keepalive_time=600| 場景 | 建議值 | 配置位置 |
|---|---|---|
| 常規業務 | 16M - 64M | [mysqld] + [client] + [mysqldump] |
| 大文本/Blob 存儲 | 256M - 1G | 同上 + 應用層分片上傳 |
| mysqldump 導出 | 100M+ | [mysqldump] max_allowed_packet |
| Replication 大事務 | 1G | [mysqld] + slave_max_allowed_packet (5.6+) |
注意:客戶端、服務端、備份工具三端必須統一設置,取最小值生效。
#!/bin/bash
# mysql_2006_diagnose.sh
echo "=== MySQL 2006 診斷 ==="
echo "1. 服務狀態: $(systemctl is-active mysqld)"
echo "2. 運行時長: $(ps -o etimes= -p $(cat /var/run/mysqld/mysqld.pid 2>/dev/null) 2>/dev/null || echo 'N/A') 秒"
echo "3. 當前連接數: $(mysql -e "SHOW STATUS LIKE 'Threads_connected';" -sN)"
echo "4. 最大連接數: $(mysql -e "SHOW VARIABLES LIKE 'max_connections';" -sN)"
echo "5. wait_timeout: $(mysql -e "SHOW VARIABLES LIKE 'wait_timeout';" -sN)"
echo "6. max_allowed_packet: $(mysql -e "SHOW VARIABLES LIKE 'max_allowed_packet';" -sN)"
echo "7. 近期錯誤日誌:"
tail -20 /var/log/mysql/error.log | grep -i -E "2006|gone away|aborted|killed|oom|restart"
echo "8. 系統 OOM 記錄:"
dmesg -T | grep -i -E "mysql|oom|kill" | tail -5
MySQL 2006 錯誤看似隨機,實則遵循明確的協議與超時機制。建立「連接池防護 + 服務端調優 + 應用重試 + 監控告警」四層防線,才能從根本上消除此類干擾業務穩定性的幽靈故障。