mysql自动新建分区

新建存储过程create_partition_nextday

功能描述:每次执行一次读取当前日期,并将日期增加一天后,新建分区

L_END:BEGIN     
    DECLARE P_NAME VARCHAR(255) DEFAULT 0;       
    DECLARE P_DESCRIPTION VARCHAR(255) DEFAULT 0;   
    DECLARE ISEXIST_PARTITION VARCHAR(255) DEFAULT 0; 
 
    SELECT PARTITION_NAME INTO ISEXIST_PARTITION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName  LIMIT 1 ;
    --###此处判断表是否为(支持)分区表的 
    IF ISEXIST_PARTITION <=> "" THEN
      SELECT "Partition table not is exist" AS "*****ERROR*****";
      LEAVE  L_END;
    END IF;
 
    SET P_DESCRIPTION =(select date_add(CURDATE(), interval 1 day));	--###此处将当前日期增加一天,作为分区名称
    SET PARTITION_TWO_DAY =(select date_add(CURDATE(), interval 2 day));
    SET P_NAME = REPLACE(P_DESCRIPTION, '-', '');
    SET @S=CONCAT('ALTER TABLE ',tableName,' ADD PARTITION  (PARTITION p',P_NAME,' VALUES LESS THAN (\'',PARTITION_TWO_DAY,'\'))');
    SELECT @S;
    PREPARE stmt2 FROM @S;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;         
END L_END

手动增加分区

ALTER TABLE hdfs_test add PARTITION (PARTITION p00000006  VALUES LESS THAN ('2018-06-12'));

手动调用存储过程

MySQL [sw]> call create_partition_nextday("sw","hdfs_test");

 

创建事件

 

 

 

查看分区

SELECT  
  partition_name part,   
  partition_expression expr,   
  partition_description descr,   
  table_rows   
FROM  
  INFORMATION_SCHEMA.partitions   
WHERE  
  TABLE_SCHEMA = schema()   
  AND TABLE_NAME='hdfs_test'; 

分区建表

create table hdfs_test(  
dt datetime,  
AddBlockNumOps                bigint,  
BlockReceivedAndDeletedNumOps bigint,  
CompleteNumOps                bigint,  
CreateNumOps                  bigint,  
DeleteNumOps                  bigint,  
GetFileInfoNumOps             bigint,  
RenameNumOps                  bigint,  
SendHeartbeatNumOps           bigint,  
AddBlockAvgTime                double,  
BlockReceivedAndDeletedAvgTime double,  
CompleteAvgTime                double,  
CreateAvgTime                  double,  
DeleteAvgTime                  double,  
GetFileInfoAvgTime             double,  
RenameAvgTime                  double,  
SendHeartbeatAvgTime           double  
)PARTITION BY RANGE COLUMNS(dt)(
PARTITION p00000001 VALUES LESS THAN ('2018-06-07'),
PARTITION p00000002 VALUES LESS THAN ('2018-06-08'),
PARTITION p00000003 VALUES LESS THAN ('2018-06-09'),
PARTITION p00000004 VALUES LESS THAN ('2018-06-10'),
PARTITION p00000005 VALUES LESS THAN ('2018-06-11')
);

每次批量新建100个分区

L_END:BEGIN
	#Routine body goes here...
  DECLARE MAX_PARTITION_DESCRIPTION VARCHAR(255) DEFAULT 0;
     DECLARE P_NAME VARCHAR(255) DEFAULT 0;       
     DECLARE P_DESCRIPTION VARCHAR(255) DEFAULT 0;   
     DECLARE i INT DEFAULT 1;
     DECLARE ISEXIST_PARTITION VARCHAR(255) DEFAULT 0; 
     SELECT PARTITION_NAME INTO ISEXIST_PARTITION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName  LIMIT 1 ;
      
     IF ISEXIST_PARTITION <=> "" THEN
       SELECT "Partition table not is exist" AS "*****ERROR*****";
       LEAVE  L_END;
     END IF;
 
     SELECT partition_description INTO MAX_PARTITION_DESCRIPTION  FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName ORDER BY partition_description DESC LIMIT 1;
       
       
     IF MAX_PARTITION_DESCRIPTION <=> "" THEN
       SELECT "Partition table is error" AS "*****ERROR*****";
       LEAVE  L_END;
     END IF;

      
    SET MAX_PARTITION_DESCRIPTION = REPLACE(MAX_PARTITION_DESCRIPTION, '\'', '');
    WHILE i <= 100 DO
           SET P_DESCRIPTION = adddate(MAX_PARTITION_DESCRIPTION, INTERVAL i day);
           SET P_NAME = REPLACE(P_DESCRIPTION, '-', '');
           SET @S=CONCAT('ALTER TABLE ',tableName,' ADD PARTITION  (PARTITION p',P_NAME,' VALUES LESS THAN (\'',P_DESCRIPTION,'\'))');
           SELECT @S;
           PREPARE stmt2 FROM @S;
           EXECUTE stmt2;
           DEALLOCATE PREPARE stmt2;
           SET i = i + 1 ;
    END WHILE;   

END

 

命令行新建存储过程

 


DELIMITER $$
use dnjmx$$
CREATE PROCEDURE create_partition_nextday(
IN databaseName VARCHAR(50),
IN tableName VARCHAR(50))
begin
L_END:BEGIN     
    DECLARE P_NAME VARCHAR(255) DEFAULT 0;       
    DECLARE P_DESCRIPTION VARCHAR(255) DEFAULT 0;
    DECLARE PARTITION_TWO_DAY VARCHAR(255) DEFAULT 0;
    DECLARE ISEXIST_PARTITION VARCHAR(255) DEFAULT 0; 
 
    SELECT PARTITION_NAME INTO ISEXIST_PARTITION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName  LIMIT 1 ;
    IF ISEXIST_PARTITION <=> "" THEN
      SELECT "Partition table not is exist" AS "*****ERROR*****";
      LEAVE  L_END;
    END IF;
 
    SET P_DESCRIPTION =(select date_add(CURDATE(), interval 1 day));
    SET PARTITION_TWO_DAY =(select date_add(CURDATE(), interval 2 day));
    SET P_NAME = REPLACE(P_DESCRIPTION, '-', '');
    SET @S=CONCAT('ALTER TABLE ',tableName,' ADD PARTITION  (PARTITION p',P_NAME,' VALUES LESS THAN (\'',PARTITION_TWO_DAY,'\'))');
    SELECT @S;
    PREPARE stmt2 FROM @S;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;         
END L_END;
END $$
DELIMITER $$
use dnjmx$$
CREATE PROCEDURE create_partition_100day(
IN databaseName VARCHAR(50),
IN tableName VARCHAR(50))
begin
L_END:BEGIN
	#Routine body goes here...
  DECLARE MAX_PARTITION_DESCRIPTION VARCHAR(255) DEFAULT 0;
     DECLARE P_NAME VARCHAR(255) DEFAULT 0;       
     DECLARE P_DESCRIPTION VARCHAR(255) DEFAULT 0;   
     DECLARE i INT DEFAULT 1;
     DECLARE ISEXIST_PARTITION VARCHAR(255) DEFAULT 0; 
     SELECT PARTITION_NAME INTO ISEXIST_PARTITION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName  LIMIT 1 ;
      
     IF ISEXIST_PARTITION <=> "" THEN
       SELECT "Partition table not is exist" AS "*****ERROR*****";
       LEAVE  L_END;
     END IF;
 
     SELECT partition_description INTO MAX_PARTITION_DESCRIPTION  FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = databaseName AND TABLE_NAME = tableName ORDER BY partition_description DESC LIMIT 1;
       
       
     IF MAX_PARTITION_DESCRIPTION <=> "" THEN
       SELECT "Partition table is error" AS "*****ERROR*****";
       LEAVE  L_END;
     END IF;
 
      
    SET MAX_PARTITION_DESCRIPTION = REPLACE(MAX_PARTITION_DESCRIPTION, '\'', '');
    WHILE i <= 100 DO
           SET P_DESCRIPTION = adddate(MAX_PARTITION_DESCRIPTION, INTERVAL i day);
           SET P_NAME = REPLACE(P_DESCRIPTION, '-', '');
           SET @S=CONCAT('ALTER TABLE ',tableName,' ADD PARTITION  (PARTITION p',P_NAME,' VALUES LESS THAN ("',P_DESCRIPTION,'"))');
           SELECT @S;
           PREPARE stmt2 FROM @S;
           EXECUTE stmt2;
           DEALLOCATE PREPARE stmt2;
           SET i = i + 1 ;
    END WHILE;   
END L_END;
END $$
查看存储过程:
select `name` from mysql.proc where db = 'dnjmx' and `type` = 'PROCEDURE';

新建定时任务


CREATE EVENT dn_create_partition_nextday
ON SCHEDULE EVERY 1 DAY
DO call create_partition_nextday("dnjmx","dn");

CREATE EVENT D_dn_create_partition_nextday
ON SCHEDULE EVERY 1 DAY
DO call create_partition_nextday("dnjmx","D_dn");
与以上2条作用相同
delimiter $$
CREATE EVENT dn_create_partition_nextday
ON SCHEDULE EVERY 1 DAY
DO 
begin
call create_partition_nextday("dnjmx","dn");
call create_partition_nextday("dnjmx","D_dn");
end $$
delimiter;

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值