清空分区

注意事项

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

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

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

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

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

名词解释

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

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

语法

ALTER alter_target_definition truncate_partition_operation_definition

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

truncate_partition_operation_definition:
		TRUNCATE PARTITION part_name
 | TRUNCATE 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 /*表名*/ 
	TRUNCATE PARTITION p1;

表组级用法

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

## 基于表组名字进行表组级的分区清空操作
ALTER TABLEGROUP tg1 /*表组名*/ 
	TRUNCATE PARTITION p1;;

## 基于表名进行表组级的分区清空操作(注意,表组内的分区表不能是GSI表或含有GSI的分区表)
ALTER TABLEGROUP BY TABLE r_t1 /*表名*/ 
	TRUNCATE 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`)) 
SUBPARTITION BY KEY(`a`) SUBPARTITIONS 2 
(
 PARTITION p0 VALUES LESS THAN (2020),
 PARTITION p1 VALUES LESS THAN (2021)
);

给r_k_tp_t1表清空一个分区p1 。具体用法如下所示:

表级用法

## 基于表名字进行表级的分区变更操作
ALTER TABLE r_k_tp_t1 /*表名*/ 
	TRUNCATE PARTITION p1; /*实际p1下的所有二级分区的数据都会被清空*/

表组级用法

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

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

## 基于表名进行表组级的分区变更操作(注意,表组内的分区表不能是GSI表或含有GSI的分区表)
ALTER TABLEGROUP BY TABLE r_k_tp_t1 /*表名*/ 
	TRUNCATE 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 /*表名*/ 
	TRUNCATE SUBPARTITION sp1;

表组级用法

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

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

## 基于表名进行表组级的分区变更操作(即基于表名自动找查对应的表组并进行操作)
ALTER TABLEGROUP BY TABLE k_r_tp_t1 /*表名*/ 
	TRUNCATE 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 /*表名*/ 
	TRUNCATE SUBPARTITION p1sp2;

表组级用法

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

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

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