您的位置:首页 > 数据库 > MySQL

mysql自动分区存储过程

2018-04-05 16:45 337 查看
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;
4000

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: