插件窝 干货文章 使用zabbix如何自动清理30天前的数据

使用zabbix如何自动清理30天前的数据

Zabbix 清理 history 历史数据 88    来源:    2025-05-07

Zabbix自动清理30天前数据方案

方法一:使用Zabbix内置Housekeeper功能

  1. 登录Zabbix Web界面
  2. 导航到"管理" → "常规" → "Housekeeping"
  3. 配置各项数据的保留时间:

    • 历史数据(history): 设置为30天
    • 趋势数据(trends): 根据需要设置(通常比历史数据保留更长)
    • 事件(events): 设置为30天
    • 告警(alerts): 设置为30天
    • 审计日志(audit log): 根据需要设置
  4. 启用Housekeeper:

    • 确保"启用内部管家"选项已勾选
    • 设置"工作时间"为低峰时段(如凌晨2-4点)

方法二:使用数据库直接清理(适用于大型环境)

对于大型Zabbix部署,Housekeeper可能效率不高,可以直接操作数据库:

MySQL/MariaDB方案

-- 清理30天前的历史数据
DELETE FROM history WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));
DELETE FROM history_uint WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));
DELETE FROM history_str WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));
-- 其他history_*表类似

-- 清理30天前的事件
DELETE FROM events WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));

-- 优化表(可选)
OPTIMIZE TABLE history, history_uint, history_str, events;

可以创建存储过程并设置定时任务执行。

PostgreSQL方案

-- 清理30天前的历史数据
DELETE FROM history WHERE clock < extract(epoch from (now() - interval '30 days'));
DELETE FROM history_uint WHERE clock < extract(epoch from (now() - interval '30 days'));
-- 其他表类似

-- 清理后建议执行VACUUM
VACUUM ANALYZE history;
VACUUM ANALYZE history_uint;

方法三:使用Zabbix API清理(适用于需要精细控制的场景)

#!/bin/bash
# 使用Zabbix API清理历史数据

ZABBIX_URL="http://your-zabbix-server/zabbix/api_jsonrpc.php"
ZABBIX_USER="Admin"
ZABBIX_PASS="zabbix"

# 获取认证令牌
AUTH_TOKEN=$(curl -s -X POST -H 'Content-Type: application/json-rpc' -d '{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "'$ZABBIX_USER'",
        "password": "'$ZABBIX_PASS'"
    },
    "id": 1
}' $ZABBIX_URL | jq -r .result)

# 计算30天前的时间戳
THIRTY_DAYS_AGO=$(date -d "30 days ago" +%s)

# 清理历史数据
curl -s -X POST -H 'Content-Type: application/json-rpc' -d '{
    "jsonrpc": "2.0",
    "method": "history.delete",
    "params": {
        "time_till": '$THIRTY_DAYS_AGO'
    },
    "auth": "'$AUTH_TOKEN'",
    "id": 1
}' $ZABBIX_URL

# 登出
curl -s -X POST -H 'Content-Type: application/json-rpc' -d '{
    "jsonrpc": "2.0",
    "method": "user.logout",
    "params": [],
    "auth": "'$AUTH_TOKEN'",
    "id": 1
}' $ZABBIX_URL

方法四:使用分区表(适用于超大型环境)

对于超大型Zabbix部署,可以考虑使用分区表按时间分区,然后直接删除旧分区。

注意事项

  1. 备份数据:在执行任何清理操作前,确保有完整备份
  2. 监控影响:清理大量数据可能影响数据库性能,应在低峰期执行
  3. 测试环境验证:建议先在测试环境验证清理脚本
  4. 逐步清理:对于特别大的数据库,考虑分批清理(如每次清理5天数据)
  5. 监控表空间:清理后可能需要执行OPTIMIZE TABLE或VACUUM回收空间

选择哪种方法取决于您的Zabbix部署规模、数据库类型和性能要求。对于大多数中小型部署,内置的Housekeeper功能已经足够。