使用MySQL定时任务 动态增加分区

一、查看定时策略是否开启
show variables like '%event_sche%';
  • 开启定时策略:
set global event_scheduler = on;
二、创建存储过程
  • 增加分区表存储过程
  • t_name 传入增加分区的数据表
CREATE DEFINER=`test`@`%` PROCEDURE `p_partition_month`(in t_name VARCHAR(50))
BEGIN
  DECLARE v_sysdate DATE;
  DECLARE v_maxdate DATETIME;
  DECLARE v_pt VARCHAR(20);
  DECLARE v_maxval int;
  DECLARE add_sql VARCHAR(256); 
  SELECT MAX(CAST(FROM_DAYS(REPLACE(partition_description,'''','')) AS DATE)) AS val INTO v_maxdate FROM  information_schema.`PARTITIONS` WHERE table_name = t_name;
	
  SET v_sysdate = SYSDATE();
	select v_maxdate,v_maxdate+ INTERVAL 1 MONTH;# 
  WHILE v_maxdate<(v_sysdate+INTERVAL 1 MONTH) DO
      SET v_pt = DATE_FORMAT(v_maxdate, '%Y%m%d');
      SET v_maxval=TO_DAYS(v_maxdate+ INTERVAL 1 MONTH);
      SET add_sql = CONCAT('alter table ', t_name,' add partition (partition p', v_pt, ' values less than(',v_maxval,'))');
      SET @sql=add_sql; #存储于会话变量
      PREPARE stmt FROM @sql;  
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
      SET v_maxdate = v_maxdate + INTERVAL 1 MONTH;
  END WHILE;
END
三、创建定时任务
  • 创建(任务名e_partition)定时任务事件,每月月底 23 点执行存储过程
CREATE EVENT e_partition
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(last_day(curdate()), INTERVAL 1 MONTH),INTERVAL 23 HOUR)
ON COMPLETION PRESERVE ENABLE
DO CALL p_partition_month();
  • 删除定时事件
drop event e_partition;
四、定时任务相关操作
  • 查看
SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS;
  • 开启
alter event run_event on completion preserve enable;
  • 关闭
alter event run_event on completion preserve disable;
五、定时规则
  • 周期执行(EVERY)
    单位有:second、minute、hour、day、week(周)、quarter(季度)、month、year
    on schedule every 1 month//每月执行1次

  • 在具体某个时间执行(AT)
    on schedule at current_timestamp()+interval 5 day //5天后执行
    on schedule at ‘2023-01-01 00:00:00’ //在2023年1月1日,0点整执行

  • 在某个时间段执行(STARTS ENDS)
    on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month //5天后开始每天都执行执行到下个月底
    on schedule every 1 day ends current_timestamp()+interval 5 day //从现在起每天执行,执行5天

六、扩展

1、分区操作

  • 创建分区
ALTER TABLE `qfyu_chat`  PARTITION BY RANGE(TO_DAYS(create_time)) (
        PARTITION p20221101 VALUES LESS THAN (TO_DAYS('2022-12-01')) ENGINE = INNODB,
		PARTITION p20221201 VALUES LESS THAN (TO_DAYS('2023-01-01')) ENGINE = INNODB,
);
  • 修改分区
alter table qfyu_chatadd partition (partition p20221101 values less than(738641))
  • 删除分区(包含数据)
alter table qfyu_chat drop partition p20221101 

2、常用 mysql 日期函数

SELECT DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY); #当月1号

select last_day(curdate());#当月月底最后一天

select DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH); #下月1号

select DATE_ADD(last_day(curdate()), INTERVAL 1 MONTH); #下月1号

SELECT  DATE_ADD(DATE_ADD(last_day(curdate()), INTERVAL 1 MONTH),INTERVAL 23 HOUR);#下月月底
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值