欢迎投稿

今日深度:

Mysql分区创建与删除方式,

Mysql分区创建与删除方式,


目录
  • Mysql分区创建与删除
    • 实例代码
  • 总结

    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 
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持PHP之友。

    您可能感兴趣的文章:
    • Mysql如何按照范围区间创建分区表
    • mysql创建表分区的实现示例
    • MySql创建分区的方法实例
    • 创建mysql表分区的方法

    www.htsjk.Com true http://www.htsjk.com/Mysql/48623.html NewsArticle Mysql分区创建与删除方式, 目录 Mysql分区创建与删除 实例代码 总结 Mysql分区创建与删除 实例代码 CREATE PROCEDURE `add_table_partition`() COMMENT '增加表分区' BEGIN/*************************************...
    评论暂时关闭