Mysql分区创建与删除

CREATE PROCEDURE `add_table_partition`() 
	COMMENT '增加表分区' 
BEGIN
	/******************************************************************
	*	Creator:	    Donne
	*	Create Date:	2019-05-29
	*	Description:	增加所有表的分区,分区类型为p_date_20190529
                        每月最后一天执行,生成下一个月所有分区
	******************************************************************/
   DECLARE  v_table_name varchar(50);
   DECLARE  v_par_name varchar(20);
   DECLARE i int DEFAULT 0; 
   DECLARE no_more int DEFAULT 0;
   ##将表名和分区名放入游标
   DECLARE cursor_employee CURSOR FOR
   SELECT table_name,max(partition_name)
	 FROM information_schema.partitions 
	WHERE table_schema='test' and partition_name is not null and partition_name<>'p_date_min'
    GROUP BY table_name;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more= 1;
  ##打开游标
  OPEN cursor_employee;
  FETCH cursor_employee INTO v_table_name,v_par_name;
  ##循环 1:ture, 0:false,!0:ture,!1:false
  ##select 1 from where !0
  WHILE !no_more DO
      my_loop: LOOP
         ##从当前开始
         SET @j:= DATE_ADD(curdate(),INTERVAL i DAY);
         ##下个月最后一天
         SET @end_date:= last_day(DATE_ADD(last_day(curdate()),INTERVAL 1 DAY));
         IF @j > @end_date THEN           
            LEAVE my_loop;
         END IF;
         #计数
         SET i=i+1;
         #分区使用values less than,所以+1 
         SET @par_value:= UNIX_TIMESTAMP(DATE_ADD(curdate(),INTERVAL i DAY));
         SET @par_name:= concat('p_date_',date_format(@j,'%Y%m%d'));
         #如果新建分区大于已有分区,则创建
         IF @par_name>v_par_name THEN
             SET @add_par:= concat('ALTER TABLE ',v_table_name,' ADD PARTITION(PARTITION ',@par_name,' VALUES LESS THAN (',@par_value,'));');
             PREPARE stmt from @add_par;
             EXECUTE stmt;
             DEALLOCATE PREPARE stmt;
         END IF;
      END LOOP;
      #重新计数
      SET i= 0;
      #从游标中取出下一条数据
      FETCH cursor_employee INTO v_table_name,v_par_name;
  END WHILE;
  CLOSE cursor_employee;
END 
CREATE PROCEDURE `drop table partition`(
		in start_date date ,
		in end_date date 
) 
	COMMENT '删除分区' 
BEGIN
	/******************************************************************
	*	Creator:	    Donne
	*	Create Date:	2019-05-29
	*	Description:	删除表分区
	******************************************************************/
   DECLARE  v_table_name varchar(50);
   DECLARE  v_par_name varchar(20);
   DECLARE i int DEFAULT 0; 
   DECLARE no_more int DEFAULT 0;
   ##将表名和分区名放入游标
   DECLARE cursor_employee CURSOR FOR
   SELECT table_name,partition_name
	 FROM information_schema.partitions 
	WHERE table_schema='test' and partition_name is not null and partition_name<>'p_date_min'
      AND partition_name>=concat('p_date_',date_format(end_date,'%Y%m%d'))
      AND partition_name<=concat('p_date_',date_format(end_date,'%Y%m%d'));
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more= 1;
  ##打开游标
  OPEN cursor_employee;
  FETCH cursor_employee INTO v_table_name,v_par_name;
  ##循环
  WHILE !no_more DO
      SET @drop_par:= concat('ALTER TABLE ',v_table_name,' DROP PARTITION ',v_par_name,';');
      PREPARE stmt from @drop_par;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
      FETCH cursor_employee INTO v_table_name,v_par_name;
  END WHILE;
  CLOSE cursor_employee;
END 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章