故障描述:

  1. 可以正常得接收到监控数据。
  2. 监控值低于触发器阈值,但告警并未恢复。
  3. 观察Zabbix Server日志存在大量数据库查询失败,并且带有提示外键冲突。

故障原因:

当触发器告警时,整个告警事件过程涉及几个表:escalations,events,problem,alerts,Zabbix整个事件管理是几个表之间相互关联,当对数据库进行一些人为操作干预,例如:恢复备份数据库或者同步数据出现异常时,都有可能导致几个表数据内容出现差异。当这几个表出现差异时,举个简单的例子在events表里的一个事件ID,但是因为数据差异alerts表里,或者是escalations表里并没有。这样就会导致ZabbixServer整个告警系统故障,无法发送告警。

解决方法:

  1. 当单条数据存在差异时,并且差异数据量不大,可以根据日志中存在差异条数,整理单独删除差异数据即可。
  2. 当差异数据量过大,这种单条清理的方式就不太适用,建议清空表中数据。
  3. 当数据量巨大,使用delete,truncate进行清理都不合适,因为清理速度过慢。这里建议的解决方法,直接drop掉表,重新创建。本身这几个表在创建时就是空表。

操作步骤:

# 首先停掉Zabbix Server服务,避免Zabbix对数据库进行操作。

systemctl stop zabbix-server

 

# 先记录建表语句,将建表语句复制出来备用。

例如:show create table events;

 

# 关闭外键约束,在drop表之前需要先关闭外键约束。

set FOREIGN_KEY_CHECKS = 0;

# 开启外键约束,等创建好空表后,在开启外键约束。此步在重新创建表后执行操作。

set FOREIGN_KEY_CHECKS = 1;

 

# drop 掉events表,依次将以上四个表drop掉。

drop table events;

# 重新创建 escalations、events、problem、alerts表

# 启动Zabbix Server,并观察日志,因为所有告警都被清空,如果之前有未恢复告警,会重新生成事件告警。