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


原文鏈接:http://www.itrensheng.com/archives/mysql_auto_create_partition

 

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

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); 

 新增分區

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

 刪除分區

alter table `test1`  drop PARTITION p20180629;

  

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

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

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.數據庫定時任務(每小時執行一次)

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 ;

 如果沒有執行,請檢查Mysql是否開啟了event(默認是關閉的)

[mysqld]
event_scheduler=ON

  

 

 


免責聲明!

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



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