基于数据存储过程和事件实现
DELIMITER $$
USE `sbtest`$$
DROP PROCEDURE IF EXISTS `create_drop_partition_test1`$$
CREATE DEFINER=`rim`@`%` PROCEDURE `create_drop_partition_test1`()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
/* 到系统表查出这个表的最大分区,得到最大分区的日期。*/
SELECT REPLACE(partition_name,'p','') INTO @Padd_name FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA='sbtest' and table_name='test1' ORDER BY partition_ordinal_position DESC LIMIT 1;
/* 分区名*/
SET @Max_date= DATE(DATE_ADD(@Padd_name+0, INTERVAL 1 DAY))+0;
/* 分区值 */
SET @Max_date_values= DATE(DATE_ADD(@Padd_name+0, INTERVAL 2 DAY))+0;
/* 修改表,在最大分区的后面增加一个分区,时间范围加1天 */
SET @padd=CONCAT('ALTER TABLE test1 ADD PARTITION (PARTITION p',@Max_date,' VALUES LESS THAN (',(@Max_date_values),'))');
/* 输出查看增加分区语句*/
PREPARE p1 FROM @padd;
EXECUTE p1;
DEALLOCATE PREPARE p1;
/* 取出最小的分区的名称,并删除。注意:删除分区会同时删除分区内的数据,慎重 */
select partition_name into @Psub_name from INFORMATION_SCHEMA.PARTITIONS
where TABLE_SCHEMA='sbtest' and table_name='test1' order by partition_ordinal_position limit 1;
/* 修改表,删除最小分区*/
SET @psub=concat('ALTER TABLE test1 DROP PARTITION ',@Psub_name);
PREPARE p2 FROM @psub;
EXECUTE p2;
DEALLOCATE PREPARE p2;
/* 提交 */
COMMIT ;
END$$
DELIMITER ;
DELIMITER ||
DROP EVENT IF EXISTS `partition_add_drop_event`||
CREATE EVENT partition_add_drop_event
ON SCHEDULE
EVERY 1 DAY STARTS '2020-03-31 00:00:01'
DO
BEGIN
CALL sbtest.`create_drop_partition_test1`;
END ||
DELIMITER ;