用存储过程定时把历史数据按照分区转移

最近在写一个日志分析系统 , 之前也写过  不过统计的时候只保留热点内容,所以数据量不算太大。这次由于需要保留全部的内容导致数据量突增,其中url表尤为突出。由原来的每天几万变成了现在的40w左右,其后先使用了分表分区。使用分表时考虑到查询一般只查询近一个月的数据,就先没按照时间专门做分表(后期可以考虑)。现在是按照当前一个月(30天)和之前的数据做了两个表(把当前一个月的表做了hash分区 按照day 分30个)。关于分区之前有记录,现在记录一下把30天以前的数据放到历史表。

DELIMITER // 
CREATE PROCEDURE `delete_data` () -- 创建delete_data 存储过程
BEGIN
DECLARE today TIMESTAMP DEFAULT CURRENT_DATE; -- 定义日期
DECLARE str4 VARCHAR(100);
DECLARE str3 VARCHAR(100);
DECLARE int23 INT;
SET int23 =DAY(DATE_ADD(today,INTERVAL 1 DAY)); -- 得到明天的日期
SET @str4=int23;

BEGIN
IF (int23 = 30) then  -- 判断是日期是否为30号
SET @str4= '0';
ELSEIF (int23 = 31) THEN -- 判断日期是否为31号
SET @str4= '1';
END IF;
END;
-- 把明天的数据copy到url_byte_total_year_2018表中
SET @str3=concat('INSERT INTO url_byte_total_year_2018 SELECT * FROM url_byte_total_1 PARTITION(','p',@str4,')');
PREPARE stmt from @str3;
EXECUTE stmt;
-- 把明天的数据从url_byte_total_1中删除
SET @str3=CONCAT('ALTER TABLE url_byte_total_1 TRUNCATE PARTITION ','p',@str4);
PREPARE stmt from @str3;
EXECUTE stmt;

END//

CALL delete_data();-- 执行存储过程


-- 定时器 从2018-04-28 4点开始 每天执行一次
create event if not exists eventJob 
on schedule every 1 DAY STARTS '2018-04-28 04:00:00'
on completion PRESERVE
do call delete_data();

如果想了解深还要自己多看看文档

一下贴出我参考到的几个别人写的分享(没仔细研究,属于临阵磨枪行)

http://www.cnblogs.com/kkcheng/archive/2010/03/19/1689672.html 点击打开链接 存储过程详解

https://blog.csdn.net/hengbao4/article/details/78084008 点击打开链接 存储过程

https://www.cnblogs.com/abc8023/p/6397804.html 点击打开链接  存储过程

https://blog.csdn.net/chenpeng19910926/article/details/51790160?locationNum=1&fps=1 点击打开链接 存储过程 if例子

https://www.cnblogs.com/gaizai/archive/2012/12/24/2831315.html 点击打开链接  定时器

https://blog.csdn.net/xiaoyangxiaodong/article/details/39581475 点击打开链接 定时器完整例子

https://www.2cto.com/database/201702/602221.html 点击打开链接 定时器详解

感谢你们的分享 谢谢

你可能感兴趣的:(数据库)