首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Zabbix「MySQL server has gone away」根因與徹底修復:重編譯開啟自動重連

     編輯:MySQL 綜合教學

錯誤現象

Zabbix Server 日誌反復出現:

[Z3005] query failed: [2006] MySQL server has gone away
[select hostid,key_,state,filter,error,lifetime from items where itemid=34993]

雖不影響監控採集,但污染日誌、掩蓋真實故障。

常規參數調優無效

調整 my.cnf:

max_allowed_packet=300M
wait_timeout=200000
interactive_timeout=200000

重啟 MySQL 後問題依舊,因為根因在 **Zabbix 客户端連接層**,而非服務端超時。

根因分析

Zabbix 2.4/2.2 版本使用的 MySQL C API 默認**不啟用自動重連**(MYSQL_OPT_RECONNECT)。當 MySQL 服務端主動斷開空閒連接(超過 wait_timeout)或網絡抖動時,Zabbix 持有的連接句柄失效,再次執行查詢即報 2006 錯誤。Zabbix 2.5+ 已在源碼修復(默認開啟重連)。

徹底修復:重編譯 Zabbix Server 開啟 mysql_reconnect

  1. 獲取源碼(與運行版本一致)
  2. 修改 src/libs/zbxdb/db.c,在 mysql_real_connect 成功後添加:
    my_bool mysql_reconnect = 1;
    if (0 != mysql_options(conn, MYSQL_OPT_RECONNECT, &mysql_reconnect))
        zabbix_log(LOG_LEVEL_WARNING, "Cannot set MySQL reconnect option.");
  3. 重新編譯安裝(保持原 configure 參數):
    ./configure --enable-server --with-mysql ...  # 其餘參數保持不變
    make && make install
  4. 替換二進制、重啟 Zabbix Server

驗證

重啟後日誌不再出現 [Z3005] ... MySQL server has gone away,連接斷開時自動靜默重連並重試查詢。

無法重編譯時的緩解方案

  • 縮短 Zabbix 配置 DBHeartbeatFrequency(如 30 秒)主動探活保持連接
  • 在 MySQL 端增大 wait_timeout(如 86400)減少主動斷開頻率
  • 部署 Proxy 分流,減少 Server 直連壓力
⚠️ 緩解方案治標不治本,**重編譯開啟重連是唯一徹底解法**。

升級建議

若業務允許,**直接升級至 Zabbix 3.0/4.0/5.0/6.0 LTS**,內建重連機制、性能更優、安全修復更及時。

一行 mysql_reconnect = 1,讓 Zabbix 與 MySQL 的連接「斷而復續、無感知」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved