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
- MySQL日志表按月分区
- MySQL 按月给表分区存储过程
- mysql存储过程按月创建表分区 方式一
- mysql存储过程按月创建表分区 方式二
- MySQL数据表range分区例子,按年/按月
- oracle 11g表智能按月分区
- SQL SERVER 如何按月创建表分区?
- Mysql 日志表按照时间分区
- Oracle 11g 实现按月创建表分区
- oracle表分区详解(按天、按月、按年等)
- Oracle 11g 通过间隔分区实现按月创建表分区
- Oracle 11g 通过间隔分区实现按月创建表分区
- mysql按月统计数据
- 实现mysql按月统计
- MySQL-按月分组查询
- MYSQL--表分区、查看分区
- PostgreSQL 强大的多层表继承--及其在海量数据分类按月分区存储中的应用
- PostgreSQL 强大的多层表继承--及其在海量数据分类按月分区存储中的应用
- dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算
- ssh root用户登录
- ubuntu生成快捷方式的简便方法
- Java构造方法
- 把vim打造成牛逼的C++ IDE
- MySQL日志表按月分区
- LeetCode之Search for a Range
- 停电。。。烦烦烦!!!
- 批梯度下降的 python 实现
- python中的while循环
- Java之集合类【ArrayList】【入门版,实例解析】
- springAOP模板
- MD5工具类 -- 文件MD5值 -- MD5加密
- 读书笔记-《用户体验设计》