首批通过分布式安全可靠测评,为关键业务系统打造
删除分区
更新时间:2026-05-01 15:18:11
您可以根据业务需要,删除分区表中的分区。
分区表对删除分区操作的支持情况
OceanBase 数据库的 MySQL 模式中,一级分区表和二级分区表对删除分区操作的具体支持情况如下表所示。
| 分区表 | 分区类型 | 删除一级分区 | 删除二级分区 |
|---|---|---|---|
| 一级分区表 |
|
支持 | - |
| 一级分区表 |
|
不支持 | - |
| 二级分区表 |
|
支持 | 支持 |
| 二级分区表 |
|
支持 | 不支持 |
| 二级分区表 |
|
支持 | 支持 |
| 二级分区表 |
|
支持 | 不支持 |
| 二级分区表 |
|
支持 | 支持 |
| 二级分区表 |
|
支持 | 不支持 |
| 二级分区表 |
|
支持 | 支持 |
| 二级分区表 |
|
支持 | 不支持 |
| 二级分区表 |
|
不支持 | 支持 |
| 二级分区表 |
|
不支持 | 不支持 |
| 二级分区表 |
|
不支持 | 支持 |
| 二级分区表 |
|
不支持 | 不支持 |
删除分区操作说明
删除分区对全局索引的影响
对于使用 Range/Range Columns、List/List Columns 分区(包括一级分区和二级分区)且支持删除分区操作的表,系统不会重建全局索引,而是通过后台合并删除数据的方式,以 lazy(延迟)维护策略保持索引有效,从而避免因索引失效导致的查询中断或性能下降。需要注意的是,该优化仅适用于普通全局索引。以下场景无法触发该优化:
- 一级分区为 Hash 分区(即使二级分区为 Range/Range Columns、List/List Columns),此时对二级分区执行删除分区操作。
- 分区键为表达式而非普通列。
控制分区 DDL 时全局索引行为的隐藏配置项
对于 V4.3.5 版本,OceanBase 数据库从 V4.3.5 BP2 版本开始引入租户级隐藏配置项 _ob_enable_truncate_partition_preserve_global_index,用于控制是否允许在 TRUNCATE/DROP 主表分区(以下简称分区 DDL)时,全局索引不失效。对于升级上来的租户,该隐藏配置项默认值为 False,对于新建租户默认值为 True,取值行为对比如下:
| 配置项值 | 分区 DDL 执行期间的行为 | 分区 DDL 执行完成后的结果 |
|---|---|---|
| True | 只有 TRUNCATE/DROP 的主表分区不允许 DML,主表的其他分区可以正常 DML。 |
全局索引不失效:主表和所有的索引表都可以执行 DML 操作,并且主表相关的全局索引不失效。 |
| False | 只有 TRUNCATE/DROP 的主表分区不允许 DML,主表的其他分区可以正常 DML。 |
全局索引失效:主表和所有的索引表都可以执行 DML 操作,主表相关的全局索引会失效或者重建。 |
示例如下:
索引维持。
obclient> ALTER SYSTEM SET _ob_enable_truncate_partition_preserve_global_index = True;索引失效。
obclient> ALTER SYSTEM SET _ob_enable_truncate_partition_preserve_global_index = False;
删除分区对并发 DDL/DML/查询 的影响
删除分区属于 Offline DDL 操作。在删除分区时,OceanBase 数据库会在目标分区上加一个分区级别的排他锁。
| 操作类型 | 在删除分区执行期间的影响 |
|---|---|
| 并发 DDL | 被禁止或阻塞。针对同一张表的任何其他 DDL 操作都无法同时执行。 |
| 并发 DML |
|
并发查询(SELECT) |
不受影响,可正常执行。 |
删除一级分区
您可以删除 Range 分区、Range Columns 分区、List 分区以及 List Columns 分区等一级分区表中的分区,Hash 分区和 Key 分区类型的一级分区表暂不支持删除分区。
删除一级分区的 SQL 语法如下:
ALTER TABLE table_name DROP PARTITION partition_name[, partition_name ...];
说明
删除一级分区时,可以删除一个或多个分区,但不能删除全部分区。
删除一级分区时,请尽量保证该分区上不存在活动的事务或查询,否则可能会导致 SQL 语句报错,或者出现一些异常情况。在
sys租户下,通过视图oceanbase.GV$OB_TRANSACTION_PARTICIPANTS查询当前还未结束的事务上下文状态。删除一级分区时,会同时删除分区中的数据,如果只需要删除数据,则可以使用
TRUNCATE语句。对于二级分区表,删除一级分区时,会同时删除该一级分区的定义和其对应的二级分区及数据。
部分示例如下:
删除一级分区表
tbl1_r中的M202011和M202012分区。obclient> CREATE TABLE tbl1_r (log_id BIGINT NOT NULL,log_value VARCHAR(50),log_date TIMESTAMP NOT NULL) PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) (PARTITION M202001 VALUES LESS THAN(UNIX_TIMESTAMP('2020/02/01')) , PARTITION M202002 VALUES LESS THAN(UNIX_TIMESTAMP('2020/03/01')) , PARTITION M202003 VALUES LESS THAN(UNIX_TIMESTAMP('2020/04/01')) , PARTITION M202004 VALUES LESS THAN(UNIX_TIMESTAMP('2020/05/01')) , PARTITION M202005 VALUES LESS THAN(UNIX_TIMESTAMP('2020/06/01')) , PARTITION M202006 VALUES LESS THAN(UNIX_TIMESTAMP('2020/07/01')) , PARTITION M202007 VALUES LESS THAN(UNIX_TIMESTAMP('2020/08/01')) , PARTITION M202008 VALUES LESS THAN(UNIX_TIMESTAMP('2020/09/01')) , PARTITION M202009 VALUES LESS THAN(UNIX_TIMESTAMP('2020/10/01')) , PARTITION M202010 VALUES LESS THAN(UNIX_TIMESTAMP('2020/11/01')) , PARTITION M202011 VALUES LESS THAN(UNIX_TIMESTAMP('2020/12/01')) , PARTITION M202012 VALUES LESS THAN(UNIX_TIMESTAMP('2021/01/01')) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_r DROP PARTITION M202011,M202012; Query OK, 0 rows affected删除 Range Columns + Range Columns 模板化分区表
t_m_rcrc中的一级分区p1和p2。obclient> CREATE TABLE t_m_rcrc(col1 INT,col2 INT) PARTITION BY RANGE COLUMNS(col1) SUBPARTITION BY RANGE COLUMNS(col2) SUBPARTITION TEMPLATE (SUBPARTITION mp0 VALUES LESS THAN(1000), SUBPARTITION mp1 VALUES LESS THAN(2000), SUBPARTITION mp2 VALUES LESS THAN(3000) ) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200), PARTITION p2 VALUES LESS THAN(300) ); Query OK, 0 rows affected obclient> ALTER TABLE t_m_rcrc DROP PARTITION p1,p2; Query OK, 0 rows affected删除 Range + Range 非模板化分区表
t_f_rr中的一级分区p1。obclient> CREATE TABLE t_f_rr(col1 INT,col2 TIMESTAMP) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(UNIX_TIMESTAMP(col2)) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')), SUBPARTITION sp1 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')), SUBPARTITION sp2 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')), SUBPARTITION sp3 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01')) ), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp4 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')), SUBPARTITION sp5 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')), SUBPARTITION sp6 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')), SUBPARTITION sp7 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01')) ) ); Query OK, 0 rows affected obclient> ALTER TABLE t_f_rr DROP PARTITION p1; Query OK, 0 rows affected
删除二级分区
删除二级分区的 SQL 语法如下:
ALTER TABLE table_name DROP SUBPARTITION subpartition_name[, subpartition_name ...];
说明
删除二级分区表中的二级分区时,请尽量保证该分区上不存在活动的事务或查询,否则可能会导致 SQL 语句报错,或者出现一些异常情况。在
sys租户下,通过视图oceanbase.GV$OB_TRANSACTION_PARTICIPANTS查询当前还未结束的事务上下文状态。删除二级分区会同时删除该分区的定义和其中的数据。
当删除多个二级分区时,这些二级分区必须属于同一个一级分区。
以删除 Range + Range 非模板化分区表 t_f_rr 中的二级分区 sp6 和 sp7 为例,示例如下:
obclient> CREATE TABLE t_f_rr(col1 INT,col2 TIMESTAMP)
PARTITION BY RANGE(col1)
SUBPARTITION BY RANGE(UNIX_TIMESTAMP(col2))
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')),
SUBPARTITION sp1 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')),
SUBPARTITION sp2 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')),
SUBPARTITION sp3 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01'))
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp4 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')),
SUBPARTITION sp5 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')),
SUBPARTITION sp6 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')),
SUBPARTITION sp7 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01'))
)
);
Query OK, 0 rows affected
obclient> ALTER TABLE t_f_rr DROP SUBPARTITION sp6,sp7;
Query OK, 0 rows affected