Mysql分區表及自動創建分區Partition


Range分區表建表語句如下,其中分區鍵必須和id構成主鍵和唯一鍵

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE  TABLE  `test1` (
   `id`  char (32)  COLLATE  utf8mb4_unicode_ci  NOT  NULL  COMMENT  '自增主鍵(guid)' ,
   `create_time`  timestamp  NOT  NULL  DEFAULT  CURRENT_TIMESTAMP  COMMENT  '創建時間' ,
   `partition_key`  int (8)  NOT  NULL  COMMENT  '分區鍵(格式:yyyyMMdd)' ,
   PRIMARY  KEY  (`id`,`partition_key`),
   UNIQUE  KEY  `id_UNIQUE` (`id`,`partition_key`)
) ENGINE=InnoDB  DEFAULT  CHARSET=utf8mb4  COLLATE =utf8mb4_unicode_ci
PARTITION  BY  RANGE (partition_key)
(PARTITION p0  VALUES  LESS THAN (20180619) ENGINE = InnoDB,
  PARTITION p20180619  VALUES  LESS THAN (20180620) ENGINE = InnoDB,
  PARTITION p20180621  VALUES  LESS THAN (20180622) ENGINE = InnoDB,
  PARTITION p20180622  VALUES  LESS THAN (20180623) ENGINE = InnoDB,
  PARTITION p20180623  VALUES  LESS THAN (20180624) ENGINE = InnoDB); 

新增分區

1
2
3
alter  TABLE  `test1`  add  PARTITION(
  PARTITION p20180629  VALUES  LESS THAN (20180630) ENGINE = InnoDB
);

刪除分區

1
alter  table  `test1`   drop  PARTITION p20180629;

 

Mysql不能自動創建分區,需要使用mysql event事件的方式自動創建分區

1.創建分區的存儲過程如下(每次執行先校驗當前分區是否存在,如果存在則不處理;不存在則創建):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
DELIMITER $$
#該表所在數據庫名稱
USE `demo`$$
DROP  PROCEDURE  IF EXISTS `create_partition_by_day`$$
CREATE  PROCEDURE  `create_partition_by_day`(IN_SCHEMANAME  VARCHAR (64), IN_TABLENAME  VARCHAR (64))
BEGIN
     #當前日期存在的分區的個數
     DECLARE  ROWS_CNT  INT  UNSIGNED;
     #目前日期,為當前日期的后一天
     DECLARE  TARGET_DATE  TIMESTAMP ;
     #分區的名稱,格式為p20180620
     DECLARE  PARTITIONNAME  VARCHAR (9);
     #當前分區名稱的分區值上限,即為 PARTITIONNAME + 1
     DECLARE  PARTITION_ADD_DAY  VARCHAR (9);
     SET  TARGET_DATE = NOW() + INTERVAL 1  DAY ;
     SET  PARTITIONNAME = DATE_FORMAT( TARGET_DATE,  'p%Y%m%d'  );
     SET  TARGET_DATE = TARGET_DATE + INTERVAL 1  DAY ;
     SET  PARTITION_ADD_DAY = DATE_FORMAT( TARGET_DATE,  '%Y%m%d'  );
     SELECT  COUNT (*)  INTO  ROWS_CNT  FROM  information_schema.partitions
     WHERE  table_schema = IN_SCHEMANAME  AND  table_name = IN_TABLENAME  AND  partition_name = PARTITIONNAME;
     IF ROWS_CNT = 0  THEN
         SET  @SQL = CONCAT(  'ALTER TABLE `' , IN_SCHEMANAME,  '`.`' , IN_TABLENAME,  '`' ,
         ' ADD PARTITION (PARTITION ' , PARTITIONNAME,  " VALUES LESS THAN (" ,
             PARTITION_ADD_DAY , ") ENGINE = InnoDB);"  );
         PREPARE  STMT  FROM  @SQL;
         EXECUTE  STMT;
         DEALLOCATE  PREPARE  STMT;
      ELSE
        SELECT  CONCAT( "partition `" , PARTITIONNAME,  "` for table `" ,IN_SCHEMANAME,  "." , IN_TABLENAME,  "` already exists" AS  result;
      END  IF;
END $$
DELIMITER ;

2.數據庫定時任務(每小時執行一次)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DELIMITER $$
#該表所在的數據庫名稱
USE `demo`$$
CREATE  EVENT IF  NOT  EXISTS `daily_generate_partition`
ON  SCHEDULE EVERY 1  hour    #執行周期,還有天、月等等
STARTS  '2018-06-20 00:00:00'
ON  COMPLETION PRESERVE
ENABLE
COMMENT  'Creating partitions'
DO  BEGIN
     #調用剛才創建的存儲過程,第一個參數是數據庫名稱,第二個參數是表名稱
     CALL datacollectcenter.create_partition_by_day( 'demo' , 'test1' );
END $$
DELIMITER ;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM