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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章