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+ 已在源碼修復(默認開啟重連)。
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.");
./configure --enable-server --with-mysql ... # 其餘參數保持不變
make && make install
重啟後日誌不再出現 [Z3005] ... MySQL server has gone away,連接斷開時自動靜默重連並重試查詢。
DBHeartbeatFrequency(如 30 秒)主動探活保持連接wait_timeout(如 86400)減少主動斷開頻率⚠️ 緩解方案治標不治本,**重編譯開啟重連是唯一徹底解法**。
若業務允許,**直接升級至 Zabbix 3.0/4.0/5.0/6.0 LTS**,內建重連機制、性能更優、安全修復更及時。
一行 mysql_reconnect = 1,讓 Zabbix 與 MySQL 的連接「斷而復續、無感知」。