MySQL日志表按月分区

来源:互联网 发布:淘宝便宜好吃的零食店 编辑:程序博客网 时间:2024/06/08 06:06

1.创建日志表

DROP TABLE IF EXISTS syslogs;CREATE TABLE `syslogs` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `content` varchar(16) DEFAULT NULL,  `ip` varchar(16) DEFAULT NULL,  `createtime` datetime NOT NULL,  PRIMARY KEY (`id`,`createtime`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.测试数据

delimiter //drop procedure if exists test_data;create procedure test_data(IN num int )begin    declare v1 int default 0;    declare ipVal varchar(50);    declare timeVal varchar(50);    declare contentVal varchar(50);    declare exit handler for sqlexception rollback;    start transaction;    while v1 < num    do        set v1 = v1 +1;        set ipVal = concat(round(1+rand()*254),'.',round(1+rand()*254),'.',round(1+rand()*254),'.',round(1+rand()*254));        set contentVal = 'test';        set timeVal = concat(round(2014 + rand()*2),'-',round(1 + rand()*11),'-',round(1 + rand()*27),' ',round(1+rand()*22),':',round(1+rand()*58),':',round(1+rand()*58));        insert into syslogs(content,ip,createtime) values ('test',ipVal,timeVal);    end while;    delete from syslogs where createtime > now();    commit;end//

3.日志表分区初始化

/* *初始化表分区 *表没有数据,添加本月分区 *表有数据,将所有数据按月分区 @tableName 表名 @columName 时间字段列名*/delimiter //drop procedure if exists partitionInit;create procedure partitionInit(IN tableName varchar(50),IN columName varchar(50))begin    set @s0 = concat('select max(',columName,') into @a from ',tableName);    prepare stmt0 from @s0;    execute stmt0;    deallocate prepare stmt0;    set @s1 = concat('select min(',columName,') into @b from ',tableName);    prepare stmt1 from @s1;    execute stmt1;    deallocate prepare stmt1;    set @maxDate = @a;    set @minDate = @b;    set @s2 = concat('alter table ',tableName,' partition by RANGE(to_days(',columName,'))(');    set @endDate = now();    if @minDate is null    then set @minDate = @endDate;         set @maxDate = @endDate;    end if;    set @minDate = date(date(@minDate)-day(@minDate)+1);    set @maxDate = date(date(@maxDate)-day(@maxDate)+1);    while to_days(@minDate)<to_days(@maxDate)      do      set @s2= concat(@s2,' PARTITION ',tableName,'_',date_format(@minDate,'%Y%m'),' VALUES less than (to_days("',date_add(@minDate,interval 1 month),'")),');      set @minDate=  date_add(@minDate,interval 1 month);    end while;    set @s2=concat(@s2,' PARTITION ',tableName,'_',date_format(@minDate,'%Y%m'),' VALUES less than (to_days("',date_add(@minDate,interval 1 month),'")));');    prepare stmt2 from @s2;    execute stmt2;    deallocate prepare stmt2;end//

4.添加次月分区

/* *添加下月表分区 前提:表已经分区过 @tableName 表名 @columName 时间字段列名*/delimiter //drop procedure if exists partitionAdd;create procedure partitionAdd(IN tableName varchar(50),IN columName varchar(50))begin    set @enddate = date_add(date(now())-day(now())+1,interval 2 month);    set @s=concat('alter table ',tableName,' add partition (partition ',tableName,'_',date_format(date_add(date(now())-day(now())+1,interval 1 month),'%Y%m'),' VALUES less than (to_days("',@enddate,'")));');    prepare stmt from @s;    execute stmt;    deallocate prepare stmt;end//

5.定时任务调度

CREATE EVENT autoPartition    ON SCHEDULE    EVERY 1 month    DO    call partitionAdd('syslogs','createtime');
0 0
原创粉丝点击