mysql自动分区存储过程

mysql自动分区存储过程

mysql自动分区存储过程
原创 2016年05月27日 16:28:57 1285
[sql] view plain copy
DELIMITER $$  
  
USE `dw`$$  
  
DROP PROCEDURE IF EXISTS `sp_tool_maintain_partition`$$  
  
CREATE DEFINER=`data`@`%` PROCEDURE `sp_tool_maintain_partition`(in_tabName VARCHAR(68),in_startDate DATE,in_endDate DATE)  
BEGIN  
  
    /******************************************************************  
    *   Procedure Name: sp_tool_maintain_partition  
    *   Parameter:  
    *   Creator:      
    *   Create Date:    2015-08-14  
    *   Description:    维护一个表的分区  
    *       Warning :   
    *       必须建一个最大分区pmax  
        *   /*限制了一次最多只能删除3个分区*/  
        *       仅适用于RANGE  COLUMNS(atdate)  按日分区   
    *   Version:    1.0  
    ******************************************************************/  
  
    DECLARE maxpdate DATE;  
    DECLARE minpdate DATE;  
    DECLARE pdate DATE;  
    DECLARE var_cou,i TINYINT DEFAULT 0;  
  
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION  
    BEGIN  
        #获得异常信息  
        GET DIAGNOSTICS @cno = NUMBER;  
        GET DIAGNOSTICS CONDITION @cno @mysql_error = MYSQL_ERRNO,@msg_text = MESSAGE_TEXT,@sql_state = returned_sqlstate;  
        IF @mysql_error IS NOT NULL AND @msg_text IS NOT NULL THEN   
            #日志变量初始化发生异常  
            SET @log_type=0;  
            SET @msg_exception=CONCAT('error_no:',@mysql_error,' sql_state:',@sql_state,' error_text:',@msg_text);  
        END IF;  
        #存储异常信息  
        CALL sp_write_error('dw.sp_tool_maintain_partition',@sql_state,@mysql_error,@msg_text,CONCAT("in_tabName =",in_tabName ,"in_startDate=",in_startDate,'in_endDate=',in_endDate));  
    END;  
  
    first_lable:BEGIN  
  
    SET var_cou=0;  
    SELECT COUNT(*) INTO var_cou  
    FROM INFORMATION_SCHEMA.PARTITIONS   
    WHERE TABLE_SCHEMA='dw' AND `table_name`=in_tabName AND partition_name='pmax';  
  
    IF var_cou =0 THEN  
        SELECT CONCAT(in_tabName,' pmax 分区找不到,推出循环');  
        LEAVE first_lable;  
    END IF;  
  
    #获取当前最大分区和最小分区  
    SELECT DATE(MAX(RIGHT(PARTITION_NAME,8))),DATE(MIN(RIGHT(PARTITION_NAME,8))) INTO maxpdate,minpdate   
    FROM INFORMATION_SCHEMA.PARTITIONS   
    WHERE TABLE_SCHEMA='dw' AND `table_name`=in_tabName AND partition_name!='pmax';  
  
    #增加分区逻辑,in_endDate用来增加分区到指定日期  
    IF(in_endDate>maxpdate) THEN  
  
        SET pdate=maxpdate;  
        SET @sqlStat=CONCAT('ALTER TABLE ',in_tabName,' REORGANIZE PARTITION pmax INTO(');  
        WHILE pdate<in_endDate DO  
            SET pdate=DATE_ADD(pdate,INTERVAL 1 DAY);  
            SET @sqlStat=CONCAT(@sqlStat,'PARTITION p',DATE(pdate)+0,' VALUES LESS THAN (''',DATE_ADD(pdate,INTERVAL 1 DAY),'''),');  
        END WHILE;  
        SET @sqlStat=CONCAT(@sqlStat,'PARTITION pmax VALUES LESS THAN (MAXVALUE))');  
       
     PREPARE stmt FROM @sqlStat;  
     SELECT @sqlStat;  
     EXECUTE stmt;  
     DEALLOCATE PREPARE stmt;  
  
    END IF;  
  
    #删除分区逻辑,in_startDate用来删除分区到指定日期,i逻辑用来限制一次最多只删除3个分区。  
    IF(in_startDate>minpdate AND i<3) THEN  
  
        SET pdate=minpdate;  
        WHILE pdate<in_startDate DO  
            SET @sqlStat=CONCAT('ALTER TABLE ',in_tabName,' DROP PARTITION p',DATE(pdate)+0);  
            PREPARE stmt FROM @sqlStat;  
            EXECUTE stmt;  
            SELECT @sqlStat;  
            DEALLOCATE PREPARE stmt;  
            SET pdate=DATE_ADD(pdate,INTERVAL 1 DAY);  
          SET i=i+1;  
        END WHILE;  
    END IF;  
  
  END first_lable;  
END$$  
  
DELIMITER ;  


mysql 定时自动新增分区

原创 2017年03月28日 10:49:15
标签:数据库 /mysql /分区 /timestamp1463

项目需要,要根据数据库表中字段mydate(timestamp)进行定时自动新增分区,上图 
这里写图片描述 
这是数据库,比较简单,主要是为了演示过程建的,然后先建立分区 
这里写图片描述

建好之后可以查询所建分区是怎样的 
这里写图片描述 
这是建立的两个分区

这里写图片描述

这是自动建立分区的代码,分区时按mydate 类型为timesamp类型,所以不能使用date类型 
@P12_Name:查询出的最大的时间戳

然后要开始定时了,先查询mysql是否事件调度器是否是开启的? 
这里写图片描述

如果value值是off 要通过上面的语句开启 使其为on 
然后执行定时语句 
这里写图片描述 
这是就生成了一个事件按一秒建立一个分区,,,可以修改为day 
再查询一下分区个数 
这里写图片描述 
一下子成了19条了。。。。好了 ,搞定

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012922706/article/details/67633201
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值