删除分区

注意事项

  • 本文要求PolarDB-X实例版本必须为5.4.14-16539836及以上;

  • 若要对二级分区进行删除操作,要求PolarDB-X实例版本必须为5.4.17-16952556及以上。

  • 哈希类型的分区策略,例如HASH/KEY/CO_HASH,不支持执行该操作。

  • Range/Range Columns的分区策略,若分区定义使用了maxvalue等“catch-all”分区,不支持执行该分区操作。

  • List/List Columns的分区策略,若分区定义使用了default等“catch-all”分区,不支持执行该分区操作。

  • 全局索引表不支持该操作。

  • 含全局索引的分区表不支持该操作。

  • 进行表组级别的操作时,同一个表组的表,不允许出现GSI表或使用了GSI的分区表。

名词解释

  • 表组:分区列完全相同的一组逻辑表或全局索引表的集合。

  • 全局索引:使用另一个维度进行水平分区的数据与主表始终保持强一致的分区表。

语法

ALTER alter_target_definition drop_partition_operation_definition

alter_target_definition:
		TABLE [db_name.]tbl_name
 | TABLEGROUP tg_name
 | TABLEGROUP BY TABLE [db_name.]tbl_name

drop_partition_operation_definition:
		DROP PARTITION part_name
 | DROP SUBPARTITION subpart_name

场景1:删除一个不包含二级分区的一级分区

r_t1与r_t2都采用Range分区,建表SQL如下所示:

CREATE TABLE `r_t1` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`)) 
(
 PARTITION p0 VALUES LESS THAN (2020),
 PARTITION p1 VALUES LESS THAN (2021)
);

CREATE TABLE `r_t2` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`)) 
(
 PARTITION p0 VALUES LESS THAN (2020),
 PARTITION p1 VALUES LESS THAN (2021)
);

删除表r_t1表的一个分区p1,具体语法如下所示:

表级用法

## 基于表名字进行表级的分区变更操作
ALTER TABLE r_t1 /*表名*/ 
	DROP PARTITION p1;

表组级用法

同一个表组的所有逻辑表同时进行增加分区的操作,即上述两个表同时执行分区变更。

## 基于表组名字进行表组级的分区变更操作
ALTER TABLEGROUP tg1 /*表组名*/ 
	DROP PARTITION p1;;

## 基于表名进行表组级的分区变更操作(即基于表名自动找查对应的表组并进行操作)
ALTER TABLEGROUP BY TABLE r_t1 /*表名*/ 
	DROP PARTITION p1;

场景2:删除一个包含二级分区的一级分区

对于含有二级分区的一级分区,删除一级分区时,连同一级分区下的所有二级分区都会删除。

r_k_tp_t1与r_k_tp_t2都采用Range分区,建表SQL如下所示:

CREATE TABLE `r_k_tp_t1` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`)) 
SUBPARTITION BY KEY(`a`) SUBPARTITIONS 2
(
 PARTITION p0 VALUES LESS THAN (2020),
 PARTITION p1 VALUES LESS THAN (2021)
);

CREATE TABLE `r_k_tp_t2` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`)) 
(
 PARTITION p0 VALUES LESS THAN (2020),
 PARTITION p1 VALUES LESS THAN (2021)
);

删除r_k_tp_t1的一个分区p1。具体语法如下所示。

表级用法

## 基于表名字进行表级的分区变更操作
ALTER TABLE r_k_tp_t1 /*表名*/ 
	DROP PARTITION p1;

表组级用法

同一个表组的所有逻辑表同时进行增加分区的操作,即上述两个表同时执行分区变更。

## 基于表组名字进行表组级的分区变更操作
ALTER TABLEGROUP tg1 /*表组名*/ 
	DROP PARTITION p1;;

## 基于表名进行表组级的分区变更操作(即基于表名自动找查对应的表组并进行操作)
ALTER TABLEGROUP BY TABLE r_k_tp_t1 /*表名*/ 
	DROP PARTITION p1;

场景3:删除一个模板化二级分区

对于模板化二级分区,所有一级分区下的二级分区会同时进行变更。

假设k_r_tp_t1与k_r_tp_t2都采用Key+Range的模板化二级分区,建表SQL如下所示:

CREATE TABLE `k_r_tp_t1` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY RANGE(YEAR(`c`))
(
 SUBPARTITION sp0 VALUES LESS THAN (2020),
 SUBPARTITION sp1 VALUES LESS THAN (2021)
);

CREATE TABLE `k_r_tp_t2` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY RANGE(YEAR(`c`))
(
 SUBPARTITION sp0 VALUES LESS THAN (2020),
 SUBPARTITION sp1 VALUES LESS THAN (2021)
);

k_r_tp_t1表删除一个Range的模板化二级分区sp1,语法如下所示。

表级用法

## 基于表名字进行表级的分区变更操作
ALTER TABLE k_r_tp_t1 /*表名*/ 
	DROP SUBPARTITION sp1;

表组级用法

同一个表组的所有逻辑表同时进行删除分区的操作,即上述两个表同时执行分区变更:

## 基于表组名字进行表组级的分区变更操作
ALTER TABLEGROUP tg1 /*表组名*/ 
	DROP SUBPARTITION sp1;

## 基于表名进行表组级的分区变更操作(即基于表名自动找查对应的表组并进行操作)
ALTER TABLEGROUP BY TABLE k_r_tp_t1 /*表名*/ 
	DROP SUBPARTITION sp1;

场景4:删除一个非模板化的二级分区

对于非模板化二级分区,支持单独对某个一级分区下的二级分区进行分区变更。

假设l_r_ntp_t1与l_r_ntp_t2都采用List+Range的非模板化分区,建表SQL如下所示:

CREATE TABLE `l_r_ntp_t1` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY LIST(`a`)
SUBPARTITION BY RANGE(YEAR(`c`))
(
 PARTITION p0 VALUES IN (2020,2022) (
 	SUBPARTITION p0sp0 VALUES LESS THAN (2020),
 	SUBPARTITION p0sp1 VALUES LESS THAN (2022)
	),
 PARTITION p1 VALUES IN (2021,2023) (
 	SUBPARTITION p1sp0 VALUES LESS THAN (2021),
 SUBPARTITION p1sp1 VALUES LESS THAN (2023),
 SUBPARTITION p1sp2 VALUES LESS THAN (2025)
	)
);

CREATE TABLE `l_r_ntp_t2` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY LIST(`a`)
SUBPARTITION BY RANGE(YEAR(`c`))
(
 PARTITION p0 VALUES IN (2020,2022) (
 	SUBPARTITION p0sp0 VALUES LESS THAN (2020),
 	SUBPARTITION p0sp1 VALUES LESS THAN (2022)
	),
 PARTITION p1 VALUES IN (2021,2023) (
 	SUBPARTITION p1sp0 VALUES LESS THAN (2021),
 SUBPARTITION p1sp1 VALUES LESS THAN (2023),
 SUBPARTITION p1sp2 VALUES LESS THAN (2025)
	)
);

给l_r_ntp_t1表的一级分区p1单独删除一个Range类型的二级分区p1sp2。具体语法如下所示:

表级用法

## 基于表名字与二级分区名字进行表级的分区变更操作
ALTER TABLE l_r_ntp_t1 /*表名*/ 
	DROP SUBPARTITION p1sp2;

表组级用法

同一个表组的所有逻辑表同时进行删除分区的操作,即上述两个表同时执行分区变更:

## 基于表组名字进行表组级的分区变更操作
ALTER TABLEGROUP tg1 /*表组名*/ 
	DROP SUBPARTITION p1sp2;

## 基于表名进行表组级的分区变更操作(即基于表名自动找查对应的表组并进行操作)
ALTER TABLEGROUP BY l_r_ntp_t1 /*表名*/ 
	DROP SUBPARTITION p1sp2;