該錯誤表示**客戶端連接在服務端已不存在**,重用失效連接觸發。系統性排查四大根因,對症下藥。
# 查看運行時長
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Uptime';"
# Uptime 很小 → 近期重啟
# 查看錯誤日誌
tail -100 /var/log/mysqld.log
# 關鍵字:Starting MySQL, InnoDB: Initializing, ready for connections
SHOW GLOBAL VARIABLES LIKE '%timeout%';
-- wait_timeout=28800 (8h), interactive_timeout=28800
-- 模擬復現
SET SESSION wait_timeout=5;
-- 等待 10 秒
SELECT 1; -- ERROR 2006
connectionTestQuery=SELECT 1、PyMySQL ping=1、mysqli MYSQLI_OPT_RECONNECTSET GLOBAL wait_timeout=86400(治標)SELECT 1 保活(不推薦,資源浪費)SHOW GLOBAL STATUS LIKE 'Com_kill';
-- 非零表示有 KILL 操作
-- 查看當前進程
SHOW FULL PROCESSLIST;
-- 發現長事務/慢查詢被 DBA/pt-kill 自動殺死
innodb_lock_wait_timeout、max_execution_time (5.7+)SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet';
-- 默認 4MB (5.6) / 64MB (5.7+)
-- 大批量 INSERT / 大字段 SELECT 觸發
-- 會話級調整
SET SESSION max_allowed_packet = 1073741824; -- 1GB
-- 全局持久調整
-- my.cnf [mysqld]
max_allowed_packet = 256M
大數據導入建議:LOAD DATA INFILE、分批次 INSERT、mysqldump --max_allowed_packet=1G。
| 現象 | 優先排查 | 驗證命令 | 解決方向 |
|---|---|---|---|
| 批處理夜間失敗 | wait_timeout | SHOW VARIABLES LIKE 'wait_timeout' | 連接池 ping / 調大超時 |
| 大文本/Blob 插入失敗 | max_allowed_packet | SHOW VARIABLES LIKE 'max_allowed_packet' | 調大參數 / 分批導入 |
| 突發性錯誤 | 服務重啟/KILL | Uptime、error.log、Com_kill | 修復崩潰原因 / 規範運維 |
| 長事務報錯 | Lock wait / KILL | SHOW ENGINE INNODB STATUS | 優化事務 / 調整超時 |
最佳實踐:應用層連接池自動驗證 + 合理超時配置 + 監控告警 三位一體。不要試圖通過單一參數調大解決所有問題,理解連接生命周期,在獲取連接時驗證、使用中異常重試、歸還時檢查,構建彈性數據訪問層。