首批通过分布式安全可靠测评,为关键业务系统打造
手动分区分裂
更新时间:2026-06-23 11:01:38
OceanBase 数据库支持在分区表中手动进行分区分裂操作,即将一个已有的分区拆分为多个分区。这个功能可以指定需要分裂的分区和新分区的分裂位点进行手动执行分区分裂命令,根据需求和数据增长情况对分区进行调整。
手动分区分裂操作的支持情况
OceanBase 数据库的行存表和列存表都支持手动分区分裂。当前版本仅支持对 Range 分区的一级分区表进行手动分区分裂操作。
说明
OceanBase 数据库从 V4.6.0 开始支持列存表的手动分区分裂。
使用限制及注意事项
- 不支持手动分裂 List、Hash 分区表。
- 不支持手动分裂二级分区表。
- 不支持被手动分裂的表的分区键与主键前缀不一样。
- 不支持无主键表的手动分区分裂。
- 不支持堆组织表的手动分区分裂。
- 不支持列存副本的手动分区分裂。
- 不支持包含列存局部索引的表手动分区分裂。
- 如果表所在的
TABLEGROUP(表组)里面包含了多张表时,不支持手动分区分裂;如果这个TABLEGROUP中只有这张表,则支持手动分区分裂。 - 不支持物化视图的手动分区分裂。
- 不支持全局索引的手动分裂。
- 不支持全文索引的手动分裂。
- 不支持空间索引的手动分裂。
- 不支持向量索引的手动分区分裂。
- 不支持单独分裂局部索引、LOB 表的分区。
手动分区分裂语法
ALTER TABLE table_name SPLIT PARTITION partition_name split_partition_option;
split_partition_option:
split_at_format
| split_into_format
split_at_format:
AT (value) [INTO (PARTITION [split_partition_name], PARTITION [split_partition_name])]
split_into_format:
INTO (PARTITION split_partition_name VALUES LESS THAN (value)
[, PARTITION split_partition_name VALUES LESS THAN (value) ...]
, PARTITION split_partition_name)
参数解释
| 参数 | 说明 |
|---|---|
| table_name | 指定表名。 |
| partition_name | 指定待分裂的分区名称。 |
| split_at_format | 使用此语法分区分裂时,将会以给定的 value 为界限,将源分区分裂为两个分区。也可以使用 INTO 子句给分裂出的分区设置名称。 |
| value | 指定分区分裂的界限(取值范围)。 |
| split_partition_name | 指定分裂出的新分区名称。 |
| split_into_format | 使用此语法分区分裂时,可以将一个分区分裂为多个分区,分区分裂所定义的 value 范围需要保证与源分区的 value 范围相同,且需要保证按升序定义 value(不允许填写最后一个分区分裂的定义,其 value 等同于源分区)。 |
示例
示例一:行存表手动分区分裂
创建 Range 分区的一级分区表 test_tbl1。
CREATE TABLE test_tbl1(col1 INT, col2 INT, PRIMARY KEY(col1))
PARTITION BY RANGE(col1)
(PARTITION p0 VALUES LESS THAN(100),
PARTITION p1 VALUES LESS THAN(200),
PARTITION p2 VALUES LESS THAN(300),
PARTITION p_max VALUES LESS THAN (MAXVALUE));
把
test_tbl1表的分区p0分裂成两个新的分区,分裂的位置是在50这个值所对应的行上。分裂后,原来的分区p0被分成两个新的分区,新分区名称由系统分配。ALTER TABLE test_tbl1 SPLIT PARTITION p0 AT (50);把
test_tbl1表的分区p1分裂成两个新的分区,分裂的位置是在150这个值所对应的行上。分裂后,原来的分区p1被分成两个新的分区,一个新分区名称为p1_1,另一个新分区名称由系统分配。ALTER TABLE test_tbl1 SPLIT PARTITION p1 AT (150) INTO ( PARTITION p1_1, PARTITION);把
test_tbl1表的分区p2分裂成两个新的分区,分裂的位置是在250这个值所对应的行上。分裂后,原来的分区p2被分成两个新的分区p2_1和p2_2。ALTER TABLE test_tbl1 SPLIT PARTITION p2 AT (250) INTO ( PARTITION p2_1, PARTITION p2_2);把
test_tbl1表的分区p_max分裂成三个新的分区,分裂的位置是在400和500这两个值所对应的行上。分裂后,原来的分区p_max被分成三个新的分区p_max_1、p_max_2和p_max_3。ALTER TABLE test_tbl1 SPLIT PARTITION p_max INTO ( PARTITION p_max_1 VALUES LESS THAN (400), PARTITION p_max_2 VALUES LESS THAN (500), PARTITION p_max_3);查看表
test_tbl1的结构和定义。SHOW CREATE TABLE test_tbl1;返回结果如下:
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | TABLE | CREATE TABLE | +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | TEST_TBL1 | CREATE TABLE "TEST_TBL1" ( "COL1" NUMBER(*,0), "COL2" NUMBER(*,0), PRIMARY KEY ("COL1") ) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by range(col1) size ('128MB') (partition "P8195" values less than (50), partition "P8196" values less than (100), partition "P1_1" values less than (150), partition "P8197" values less than (200), partition "P2_1" values less than (250), partition "P2_2" values less than (300), partition "P_MAX_1" values less than (400), partition "P_MAX_2" values less than (500), partition "P_MAX_3" values less than (MAXVALUE)) | +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set
示例二:列存表手动分区分裂
创建 Range 分区的一级分区的列存表 test2_tbl2。
obclient> CREATE TABLE test2_tbl2(col1 INT, col2 INT, col3 INT, PRIMARY KEY(col1))
PARTITION BY RANGE(col1)
(PARTITION p0 VALUES LESS THAN(50),
PARTITION p1 VALUES LESS THAN(100),
PARTITION p_max VALUES LESS THAN (MAXVALUE))
WITH COLUMN GROUP (each column);
把
test2_tbl2表的分区p0分裂成两个新的分区,分裂的位置是在30这个值所对应的行上。分裂后,原来的分区p0被分成两个新的分区,新分区名称由系统分配。ALTER TABLE test2_tbl2 SPLIT PARTITION p0 AT (30);查看表
test2_tbl2的结构和定义。obclient> SHOW CREATE TABLE test2_tbl2;返回结果如下:
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | TABLE | CREATE TABLE | +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | TEST2_TBL2 | CREATE TABLE "TEST2_TBL2" ( "COL1" NUMBER(*,0), "COL2" NUMBER(*,0), "COL3" NUMBER(*,0), PRIMARY KEY ("COL1") ) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by range("COL1") (partition "P8194" values less than (30), partition "P8195" values less than (50), partition "P1" values less than (100), partition "P_MAX" values less than (MAXVALUE)) WITH COLUMN GROUP(each column) | +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set