Range分區表建表語句以下,其中分區鍵必須和id構成主鍵和惟一鍵mysql
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);
|
新增分區sql
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事件的方式自動建立分區ui
1.建立分區的存儲過程以下(每次執行先校驗當前分區是否存在,若是存在則不處理;不存在則建立):spa
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.數據庫定時任務(每小時執行一次)code
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 ;
|