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 ;
这是数据库,比较简单,主要是为了演示过程建的,然后先建立分区
建好之后可以查询所建分区是怎样的
这是建立的两个分区
这是自动建立分区的代码,分区时按mydate 类型为timesamp类型,所以不能使用date类型
@P12_Name:查询出的最大的时间戳
然后要开始定时了,先查询mysql是否事件调度器是否是开启的?
如果value值是off 要通过上面的语句开启 使其为on
然后执行定时语句
这是就生成了一个事件按一秒建立一个分区,,,可以修改为day
再查询一下分区个数
一下子成了19条了。。。。好了 ,搞定
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012922706/article/details/67633201
原创 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
相关文章推荐
- mysql自动分区存储过程
- mysql获取某个范围内的随机数,写了个存储过程自动生成随机6为密码
- ORACLE创建、增加分区及每月自动创建新分区表存储过程
- 如何在存储过程中自动添加分区
- 自动为分区表增加分区存储过程
- mysql启用系统定时任务自动调用存储过程动态拼接表
- mysql通过存储过程对表分区进行重新分区
- mysql启用系统定时任务自动调用存储过程动态拼接表
- mysql存储过程中传decimal值会自动四舍五入,没有小数
- oracle一卡通消费数据分区表建立及自动建立分区存储过程
- 关于mysql存储过程中传decimal值会自动四舍五入的这个坑
- mysql存储过程利用游标查询每个数据库的所有表
- mysql存储过程的创建,删除,调用及其他常用命令
- mysql 存储过程
- 自动产生存储过程的sql 脚本
- shell 调用mysql 存储过程判断真假
- MySQL存储过程详解
- mysql利用存储过程实现对数据库数据的迁移
- MySql存储过程及MySql常用流程控制语法
- MySQL-存储过程权限报错