故障描述:
- 可以正常得接收到监控数据。
- 监控值低于触发器阈值,但告警并未恢复。
- 观察Zabbix Server日志存在大量数据库查询失败,并且带有提示外键冲突。
故障原因:
当触发器告警时,整个告警事件过程涉及几个表:escalations,events,problem,alerts,Zabbix整个事件管理是几个表之间相互关联,当对数据库进行一些人为操作干预,例如:恢复备份数据库或者同步数据出现异常时,都有可能导致几个表数据内容出现差异。当这几个表出现差异时,举个简单的例子在events表里的一个事件ID,但是因为数据差异alerts表里,或者是escalations表里并没有。这样就会导致ZabbixServer整个告警系统故障,无法发送告警。
解决方法:
- 当单条数据存在差异时,并且差异数据量不大,可以根据日志中存在差异条数,整理单独删除差异数据即可。
- 当差异数据量过大,这种单条清理的方式就不太适用,建议清空表中数据。
- 当数据量巨大,使用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,并观察日志,因为所有告警都被清空,如果之前有未恢复告警,会重新生成事件告警。