MySQL自动增删分区——数据库实现方案

基于数据存储过程和事件实现

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 ;

猜你喜欢

转载自blog.csdn.net/qq_42979842/article/details/113702335