目錄
目的表:sp_program_playinfo
目的字段:create_time
主鍵 :id
表爲已創建表
查詢當前表是否存在分區
SELECT
partition_name
FROM
information_schema.PARTITIONS
WHERE
table_schema = SCHEMA ( )
AND table_name = 'sp_program_playinfo'
AND partition_name LIKE 'p2019%';;
1.分區
執行修改分區語句會提示:1503 - A PRIMARY KEY must include all columns in the table's partitioning function
意思是 主鍵必須包含表的分區函數中的所有列,所以我們將該列改爲聯合主鍵。
alter TABLE `sp_program_playinfo` PARTITION BY RANGE (TO_DAYS(create_time))
(
PARTITION p20180601 VALUES LESS THAN (TO_DAYS('20180601')) ENGINE = InnoDB,
PARTITION p20180701 VALUES LESS THAN (TO_DAYS('20180701')) ENGINE = InnoDB,
PARTITION p20180801 VALUES LESS THAN (TO_DAYS('20180801')) ENGINE = InnoDB,
PARTITION p20180901 VALUES LESS THAN (TO_DAYS('20180901')) ENGINE = InnoDB,
PARTITION p20181001 VALUES LESS THAN (TO_DAYS('20181001')) ENGINE = InnoDB,
PARTITION p20181101 VALUES LESS THAN (TO_DAYS('20181101')) ENGINE = InnoDB,
PARTITION p20181201 VALUES LESS THAN (TO_DAYS('20181201')) ENGINE = InnoDB,
PARTITION p20190101 VALUES LESS THAN (TO_DAYS('20190101')) ENGINE = InnoDB,
PARTITION p20190201 VALUES LESS THAN (TO_DAYS('20190201')) ENGINE = InnoDB,
PARTITION p20190301 VALUES LESS THAN (TO_DAYS('20190301')) ENGINE = InnoDB,
PARTITION p20190401 VALUES LESS THAN (TO_DAYS('20190401')) ENGINE = InnoDB
);
Range() 參數爲目的列所產生的值,TO_DAYS(日期值)是mysql 函數:返回一個天數(從公元0年到目的值的天數);
PARTITION 分區名稱 VALUES LESS THAN (區間值) ENGINE = InnoDB,
由於我的表分區需要定時動態自增,所有上面的語句到了20190401以後就會出錯,因爲20190401以後的時間沒有分配到分區。如果需要進行完整分區可以加上
PARTITION pMaxValue VALUES LESS THAN MAXVALUE
2.分區定時任務:存儲過程與定時任務
1.存儲過程
CREATE DEFINER=`root`@`%` PROCEDURE `autoPartition`(IN table_name VARCHAR(64),OUT theSql VARCHAR(200))
BEGIN
# 目標分區數
DECLARE target_PCount INT DEFAULT -1;
DECLARE newPName VARCHAR(21);
DECLARE target_Date TIMESTAMP;
SET target_Date = DATE_ADD(CURRENT_DATE(),INTERVAL 1 DAY);
SET newPName = DATE_FORMAT( target_Date, 'p%Y%m%d' );
select COUNT(1) c INTO target_PCount from information_schema.partitions where table_schema = schema() and table_name= table_name AND partition_name = newPName;
IF target_PCount <= 0 THEN
SET @createPartitonSQL = CONCAT('ALTER TABLE ',table_name,' add PARTITION( PARTITION ' , newPName,
' VALUES LESS THAN (TO_DAYS("', target_Date , '")) ENGINE = InnoDB);' );
PREPARE STMT FROM @createPartitonSQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
SELECT @createPartitonSQL INTO theSql;
END IF;
END
2.創建 定時器計劃
create EVENT `PartitionTest`.`autoCreatePartition_sp_program_playinfo`
ON SCHEDULE
EVERY '7' WEEK STARTS '2019-01-01 00:00:00'
DO call createPartition('sp_program_playinfo') ;