首批通过分布式安全可靠测评,为关键业务系统打造
修改表组属性
更新时间:2026-07-16 19:52:04
创建表组后,根据业务调整,可以修改表组属性。
使用限制
- OceanBase 数据库升级过程中,禁止修改表组属性。
- 执行该语句需要确保当前用户拥有全局
ALTER权限。
修改规则
修改表组的 SHARDING 属性时,需要先查看表组内是否存在表,以及表组内表的分区信息,查看表组内的表的具体操作请参见 查看表组信息。
如果表组内没有表,则可以任意修改表组的
SHARDING属性。如果表组内已有表,则需要遵循以下修改规则:
将表组的
SHARDING属性修改为NONE时,不需要考虑表组内表的分区定义,可以直接修改。将表组的
SHARDING属性修改为PARTITION时:- 如果表组内的所有表都是非分区表,则可以直接修改。
- 如果表组内同时有非分区表和分区表,则无法修改。
- 如果表组内仅有一级分区表或二级分区表,则要求表组内所有表的一级分区对应的分区类型、分区个数及分区值均相同,否则无法修改。
将表组的
SHARDING属性修改为ADAPTIVE时:- 如果表组内的所有表都是非分区表,则可以直接修改。
- 如果表组内同时有非分区表和分区表,则无法修改。
- 如果表组内同时有一级分区表和二级分区表,则无法修改。
- 如果表组内全部是一级分区表,则要求所有一级分区表对应分区类型、分区个数、分区值均相同。
- 如果表组内全是二级分区表,则要求所有一级分区表和二级分区表对应分区类型、分区个数、分区值均相同。
V4.4.2 BP1 及之后版本修改表组属性时,还需满足
SHARDING和SCOPE以下组合:说明
对于 V4.4.2 版本,从 V4.4.2 BP1 版本开始支持表组的
SCOPE属性。SHARDING = 'NONE'+SCOPE = 'SERVER'SHARDING = 'NONE'+SCOPE = 'ZONE'SHARDING = 'NONE'+SCOPE = 'CLUSTER'SHARDING = 'PARTITION'+SCOPE = 'CLUSTER'SHARDING = 'ADAPTIVE'+SCOPE = 'CLUSTER'
语法
修改表组属性的 SQL 语句如下:
ALTER TABLEGROUP tablegroup_name
[sharding_option,]
[scope_option];
table_name_list:
table_name [, table_name ...]
sharding_option:
SHARDING = '{NONE | PARTITION | ADAPTIVE}'
scope_option:
SCOPE = '{SERVER | ZONE | CLUSTER}'
参数说明:
tablegroup_name:待修改的表组名。sharding_option:用于修改表组SHARDING属性,SHARDING决定了表组内各表之间对应分区的聚合方式,聚合的一组分区称为 Partition Group(分区组),是分布打散的最小单位。取值如下:NONE:表示对加入表组内各表的分区方式无限制,且表之间分区不作聚合。在 V4.4.2 BP1 之前版本中,NONE语义还包含所有分区都在同一日志流上不作打散,新版本去除该语义,具体是否打散还取决于SCOPE属性。- 对于一级分区表: 每个一级分区作为一个独立的 Partition Group。
- 对于二级分区表: 每个二级分区作为一个独立的 Partition Group。
- 对于非分区表: 整个表作为一个 Partition Group。
- 全局索引:非分区表视作一个分区,每个分区作为一个 Partition Group。
PARTITION:整个表组是一个 Balance Group,同一一级分区索引的分区聚合在同一 Partition Group。要求加入表组的所有表其对应的一级分区必须与表组中所有表的一级分区的分区定义一致,包括分区类型、分区个数、分区值。相同的分区定义具体指:- 分区类型相同,例如,都是 Range 分区。
- 如果是 Hash 分区,要求引用的列数相同,并且分区个数相同。
- 如果是 Range 分区,要求引用的列数相同,分区数相同,Range 分割点也相同。
ADAPTIVE:默认值,要求加入表组的所有表其对应的一级分区和二级分区必须与表组中所有表的一级分区和二级分区的分区定义一致,包括分区类型、分区个数、分区值。- 全部是一级分区表:整个表组是一个 Balance Group,同一一级分区索引的分区聚合在同一 Partition Group;
- 全部是二级分区表:同一一级分区索引的为一个均衡组,均衡组下同一二级分区索引的二级分区聚合在同一 Partition Group。
相同的分区定义具体指:
- 分区类型相同,例如,都是 Hash + Range 分区。
- 如果是 Hash 分区,要求引用的列数相同,并且分区个数相同。
- 如果是 Range 分区,要求引用的列数相同,分区数相同,Range 分割点也相同。
- 对于二级分区,根据其分区类型,与一级分区的要求相同。
scope_option:可选项,用于指定表组的SCOPE属性。SCOPE决定了表组内所有聚合后的 Partition Group 的分布范围。取值如下:SERVER:表示所有 Partition Group 的 Leader 聚集在同一节点上。ZONE:表示所有 Partition Group 的 Leader 分布在同一 Zone 内,且打散在 Zone 内各节点。CLUSTER:表示所有 Partition Group 的 Leader 打散在集群内各节点。
说明
对于 V4.4.2 版本,从 V4.4.2 BP1 版本开始支持表组的
SCOPE属性。
示例
示例一:修改 SHARDING = 'PARTITION' 表组属性
注意
本示例适用于 V4.4.2 BP1 之前版本。
创建一个
SHARDING属性为PARTITION的表组tblgroup1。CREATE TABLEGROUP tblgroup1 SHARDING = 'PARTITION';创建两个分区定义相同的一级分区表
tbl1和tbl2,并加入到表组tblgroup1。CREATE TABLE tbl1(col1 NUMBER,col2 VARCHAR2(50)) TABLEGROUP = tblgroup1 PARTITION BY LIST(col1) (PARTITION p0 VALUES('01'), PARTITION p1 VALUES('02') );CREATE TABLE tbl2(col1 NUMBER,col2 VARCHAR2(50)) TABLEGROUP = tblgroup1 PARTITION BY LIST(col1) (PARTITION p0 VALUES('01'), PARTITION p1 VALUES('02') );将表组
tblgroup1的SHARDING属性修改为ADAPTIVE。ALTER TABLEGROUP tblgroup1 SHARDING = 'ADAPTIVE';查看表组属性。
SHOW TABLEGROUPS WHERE tablegroup_name = 'TBLGROUP1';结果如下:
+-----------------+------------+---------------+----------+ | TABLEGROUP_NAME | TABLE_NAME | DATABASE_NAME | SHARDING | +-----------------+------------+---------------+----------+ | TBLGROUP1 | TBL1 | SYS | ADAPTIVE | | TBLGROUP1 | TBL2 | SYS | ADAPTIVE | +-----------------+------------+---------------+----------+ 2 rows in set表组内的表
TBL1和TBL2全部是一级分区表,且分区类型、分区个数、分区值均相同,符合修改规则,SHARDING属性修改成功。
示例二:修改 SHARDING = 'NONE' + SCOPE = 'ZONE' 表组属性
创建
SHARDING = 'NONE' + SCOPE = 'ZONE'的表组tblgroup2。obclient> CREATE TABLEGROUP tblgroup2 SHARDING = 'NONE', SCOPE = 'ZONE';创建表非分区表
test_tbl3,并加入到表组tblgroup2。obclient> CREATE TABLE test_tbl3 (col1 NUMBER PRIMARY KEY, col2 VARCHAR2(50)) TABLEGROUP = tblgroup2;创建一级分区表
test_tbl4,并加入到表组tblgroup2。obclient> CREATE TABLE test_tbl4 (col1 NUMBER PRIMARY KEY, col2 VARCHAR2(50)) TABLEGROUP = tblgroup2 PARTITION BY LIST(col1) (PARTITION p0 VALUES('01'), PARTITION p1 VALUES('02') );将表组
tblgroup2的属性修改为SHARDING = 'NONE'+SCOPE = 'SERVER'。obclient> ALTER TABLEGROUP tblgroup2 SCOPE = 'SERVER';查看表组属性。
obclient> SHOW TABLEGROUPS WHERE tablegroup_name = 'TBLGROUP2';结果如下:
+-----------------+------------+---------------+----------+--------+ | TABLEGROUP_NAME | TABLE_NAME | DATABASE_NAME | SHARDING | SCOPE | +-----------------+------------+---------------+----------+--------+ | TBLGROUP2 | TEST_TBL3 | TEST_USER001 | NONE | SERVER | | TBLGROUP2 | TEST_TBL4 | TEST_USER001 | NONE | SERVER | +-----------------+------------+---------------+----------+--------+ 2 rows in set