IT运维管理,ITIL,ITSS,ITSM,ISO20000-ITIL先锋论坛

 找回密码
 立即注册 - 请先获取邀请码

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 291|回复: 0

[Zabbix专区] 怎样利用event为zabbix数据表定期添加和删除分区

[复制链接]
来自- 湖南娄底

参加活动:0

组织活动:12

发表于 2017-9-10 10:53:44 | 显示全部楼层 |阅读模式 来自- 湖南娄底
导读
利用MySQL的event来自动维护表分区。
我们去年就开始把zabbix数据库改成用TokuDB来支撑,并且启用了表分区(详情见:[url=]迁移Zabbix数据库到TokuDB[/url])。这样做的好处很明显,较早的历史数据可以通过删除分区快速废弃掉。要知道,zabbix数据表默认是没有针对时间字段创建索引的,因此如果执行删除的SQL命令,其效率会很差,而直接删除分区就快多了。
先看history表的分区规则:
CREATE TABLE history (  itemid bigint(20) unsigned NOT NULL,  clock int(11) NOT NULL DEFAULT '0',  value double(16,4) NOT NULL DEFAULT '0.0000',  ns int(11) NOT NULL DEFAULT '0',  KEY history_1 (itemid,clock)) ENGINE=TokuDB DEFAULT CHARSET=utf8 ROW_FORMAT=TOKUDB_QUICKLZPARTITION BY RANGE (clock)(PARTITION p20150531 VALUES LESS THAN (1433088000) ENGINE = TokuDB,... PARTITION p20160411 VALUES LESS THAN (1460390400) ENGINE = TokuDB);
对这个表,我们每天要的是:创建一个新的分区,而后删除N个月前的历史旧分区。这个工作可以通过系统的cron来实施,也可以利用MySQL自身的event来做,在这里我们选择用event,没什么特殊的原因,只是想顺便尝试下event而已,呵呵。
一个定期调度的event写起来并不难,下面是参考样例,相信很快就能看明白:
delimiter $$$drop event if exists zabbix_alter_aprtition_daily;CREATE EVENT zabbix_alter_partition_daily    ON SCHEDULE EVERY 1 DAY -- 每天执行    DO      begin-- 记日志insert into zlogs select 0, now(), date_format(date_sub(now(), INTERVAL 180 DAY),                         " ALTER TABLE history DROP PARTITION p%Y%m%d");-- 删除history表180天前的旧分区-- 用PREPARE & EXECUTE 准备和执行删除的SQLSET @drop_p_stmt = date_format(date_sub(now(), INTERVAL 180 DAY)," ALTER TABLE history DROP PARTITION p%Y%m%d")REPARE drop_p_stmt FROM @drop_p_stmt;EXECUTE drop_p_stmt;-- 创建history表30天后的新分区-- 记日志
insert into zlogs select 0, now(), concat(date_format(date_add(now(), INTERVAL 180 DAY)," ALTER TABLE history ADD PARTITION ( PARTITION p%Y%m%d VALUES LESS THAN "),"(", unix_timestamp( date_add(date_format(now(), "%Y%m%d"), INTERVAL 31 DAY) ),"))");

-- 用PREPARE & EXECUTE 准备和执行创建新分区的SQL
SET @add_p_stmt = concat(date_format(date_add(now(), INTERVAL 30 DAY)," ALTER TABLE history ADD PARTITION ( PARTITION p%Y%m%d VALUES LESS THAN "),"(",unix_timestamp( date_add(date_format(now(), "%Y%m%d"), INTERVAL 31 DAY) ),"))")REPARE add_p_stmt FROM @add_p_stmt;EXECUTE add_p_stmt;      end $$$delimiter ;


原创: 叶金荣

本版积分规则

团购课程最新动态

 

 

高品质!好口碑!

百分百通过率!

PeopleCertEXIN

国际授权资质!

ITIL Foundation北上广

2天精华班,包证书

ITIL Foundation三天精

讲,知名讲师,包证书

ITIL Expert 金牌讲师北

上广深11天,包证书

DevOps Foundation

2天热点认证班,包证书

ITSS 认证IT服务经理

4天课程,包证书

Prince2双证4天高级班

Cobit高端课程2天班

Togaf高端课程4天班

 

报名热线: 4008-060-230


QQ|小黑屋|手机版|Archiver|ITIL先锋论坛万人社区 ( 粤ICP备17056641号|网站地图

Baidu

GMT+8, 2018-4-25 02:03 , Processed in 0.337463 second(s), 34 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表