zabbix删除历史数据 mysql 表自动分区、删除

----2016年终总结 二


zabbix清理历史数据是个比较蛋疼的问题,尤其在监控数据较多时,一方面无法彻底释放历史数据空间,一方面数据库删除速度是个瓶颈,housekeeper进程长时间占用过高。

如果对数据库中的history_uint表进行分区,则可以解决以上问题。但此方法不利于数据库的规范管理,仅适用于小规模的监控场景。同时,定时脚本本身也是挖坑,这只是个临时解决方案。

 

DATA_STAMP_ONE_DAY_LONGTH=86400#一天的时间戳跨度
LOGFILE="/var/log/zabbix/partition.log"
HISTORY_PERIOD=7  #历史纪录保留天数
DATA_TODAY=`date +%Y%m%d` #获取今天时间
DATA_STAMP_TODAY=`date --date=$DATA_TODAY +%s` #今天的时间戳

((HISTORY_TIMESTAMP_LONGTH=$DATA_STAMP_ONE_DAY_LONGTH * $HISTORY_PERIOD)) #一个周期的时间戳长度
((DATA_STAMP_TOMORROW=$DATA_STAMP_TODAY + $DATA_STAMP_ONE_DAY_LONGTH)) #第二天的时间戳
((DATA_STAMP_HISTORY=$DATA_STAMP_TOMORROW - $HISTORY_TIMESTAMP_LONGTH)) #一个周期前的时间戳

DATA_HISTORY=`date -d @$DATA_STAMP_HISTORY +"%Y%m%d"` #一个周期前的日期
DATA_TOMORROW=`date -d @$DATA_STAMP_TOMORROW +"%Y%m%d"` #第二天的日期

echo ' ' >>$LOGFILE

#创建第二天使用的分区
mysql -u$USER_NAME -p$PASSWORD -D zabbix -e "ALTER TABLE \`history_uint\` ADD PARTITION (PARTITION p$DATA_TOMORROW VALUES LESS THAN ($DATA_STAMP_TOMORROW) ENGINE = InnoDB);" 2> /tmp/partition_temp_log
if [ $? -eq 0 ];then
	echo "SUCCESS! CREATE PARTITION p$DATA_TOMORROW at `date`" >> $LOGFILE
else
	echo "FAILED! CREATE PARTITION p$DATA_TOMORROW at `date`" >> $LOGFILE
	echo `cat /tmp/partition_temp_log` >> $LOGFILE
fi


#删除一个周期前的分区
mysql -u$USER_NAME -p$PASSWORD -D zabbix -e "ALTER TABLE \`history_uint\` DROP PARTITION p$DATA_HISTORY;" 2> /tmp/partition_temp_log
if [ $? -eq 0 ];then
	echo "SUCCESS! DROP PARTITION p$DATA_HISTORY at `date`" >> $LOGFILE
else
	echo "FAILED! DROP PARTITION p$DATA_HISTORY at `date`" >> $LOGFILE
	echo `cat /tmp/partition_temp_log` >> $LOGFILE
fi


 

 posted on 2017-01-30 16:19  TerrellChen  阅读(378)  评论(0编辑  收藏  举报