玖叶教程网

前端编程开发入门

Mysql自动建立表分区,按天分区,默认删除30天前的分区

平时工作中所遇到的问题,今天为大家整理一下,废话不多说,直接上代码


建立存储过程后,需创建Mysql定时任务,来每天自动执行,我自动的版本,默认晚上11点自动调用存储过程



注:如表中存在数据,必须手动对已有数据建立分区,且分区为主键或者联合主键,下面直接贴代码,可根据自己实际情况进行修改。

-- 增加新分区

-- 不同于insert into A select from B,A必须存在。

SELECT max(cast(replace(partition_description, '''', '') AS date)) AS val

INTO v_maxdate

FROM INFORMATION_SCHEMA.PARTITIONS

WHERE TABLE_NAME = 'tb_visit' AND TABLE_SCHEMA = 'fzmy'; # 目标表 数据库实例名称,根据实际情况添加

set v_sysdate = sysdate(); # 赋值v_sysdate为当前时间



-- INTERVAL 时间计算的关键字

-- 当前写法默认创建三天后的分区表 可更改

WHILE v_maxdate <= (v_sysdate + INTERVAL 1 DAY) DO

SET v_pt = date_format(v_maxdate + INTERVAL 1 DAY , '%Y%m%d');

SET v_maxval = v_maxdate + INTERVAL 2 DAY;

SET add_sql = concat('alter table tb_visit add partition (partition p', v_pt, ' values less than(''', v_maxval, '''))'); # tb_visit 目标表,根据实际情况修改

SET @sql=add_sql;

PREPARE stmt FROM @sql; # 分配给这条SQL语句一个名字供之后调用

EXECUTE stmt; # 命令执行

DEALLOCATE PREPARE stmt; # 执行完后,释放掉

SET v_maxdate = v_maxdate + INTERVAL 1 DAY; # 最大值 加一操作

END WHILE;


-- 查找最早的分区

SELECT min(cast(replace(partition_description, '''', '') AS date)) AS val

INTO v_mindate

FROM INFORMATION_SCHEMA.PARTITIONS

WHERE TABLE_NAME = 'tb_visit' AND TABLE_SCHEMA = 'fzmy';# tb_visit 目标表,根据实际情况修改


-- 删除30天前的旧分区

WHILE v_mindate <= (v_sysdate - INTERVAL 30 DAY) DO

SET v_pt = date_format(v_mindate , '%Y%m%d');

SET del_sql = concat('alter table tb_visit drop partition p', v_pt); # tb_visit 目标表,根据实际情况修改

set @sql=del_sql;

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SET v_mindate = v_mindate + INTERVAL 1 DAY;

END WHILE;


END

------------------------------------- 此处为分界线 -------------------------------------------

-- 创建定时任务

create event ceshi_partition # 定时任务名称

-- 每天晚上23点执行(待验证)

ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 23 HOUR)

on completion preserve disable

do call p_partition_test(); # 调用存储过程,此处为存储过程名称

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言