首批通过分布式安全可靠测评,为关键业务系统打造
设置分区权重
更新时间:2026-06-02 12:31:14
可以根据业务需要,为表设置分区权重。按照级别从上到下,支持设置表级、分区级的分区权重。
使用限制及注意事项
仅用户租户支持手动设置分区权重,系统租户不支持设置分区权重。
当前仅支持对非分区表、以及分区表的分区设置分区权重,暂不支持对二级分区设置分区权重。
仅支持对已存在的实体分区设置权重,不支持在建表时指定权重,即需要先创建表后,再为表设置分区权重。
分区权重仅支持整数,取值范围为 [1, +∞)。默认情况下,分区没有权重。
设置分区权重时,建议分区权重的档位尽量少,建议最多划分三挡:
大权重 = 100% * 分区数
中权重 = 50% * 分区数
小权重 = 1
对于不需要参与权重均衡的分区表,建议不要设置分区权重。
设置分区权重时,下级分区默认继承上级分区权重。如果同时对多个级别设置了分区权重,则下级权重将覆盖上级权重。
设置分区权重后,如果用户执行了 Offline DDL 操作(例如 Truncate Table、Truncate Partition 等操作)导致分区实体发生变化,原来设置的分区权重也会失效,需要用户重新设置分区权重。可能会导致分区权重失效的 Offline DDL 参见 Online DDL 和 Offline DDL 操作(MySQL 模式) 和 Online DDL 和 Offline DDL 操作(Oracle 模式)。
MySQL 模式下设置分区权重
用户登录集群的 MySQL 租户。
连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql001#obdemo -p***** -A(可选)创建待设置分区权重的表。
例如,创建一个 Hash 分区表
tbl1_h。obclient(root@mysql001)[test]> CREATE TABLE tbl1_h(col1 INT,col2 VARCHAR(50)) PARTITION BY HASH(col1) PARTITIONS 5;(可选)获取表的分区信息。
obclient(root@mysql001)[test]> SELECT TABLE_NAME, PARTITION_NAME FROM information_schema.PARTITIONS WHERE TABLE_NAME ='tbl1_h';查询结果如下:
+------------+----------------+ | TABLE_NAME | PARTITION_NAME | +------------+----------------+ | tbl1_h | p0 | | tbl1_h | p3 | | tbl1_h | p2 | | tbl1_h | p4 | | tbl1_h | p1 | +------------+----------------+ 5 rows in set根据业务需求,选择合适的级别,设置分区权重。
分区权重仅支持整数,取值范围为 [1, +∞)。默认情况下,分区没有权重。
设置表级权重
支持设置分区表或非分区表的表级分区权重。例如,设置分区表
tbl1_h的分区权重为 1,语句如下。obclient(root@mysql001)[test]> CALL DBMS_BALANCE.SET_BALANCE_WEIGHT(1,'test','tbl1_h');设置一级分区级权重
设置表
tbl1_h中一级分区p0的分区权重为 2,语句如下。obclient(root@mysql001)[test]> CALL DBMS_BALANCE.SET_BALANCE_WEIGHT(2,'test','tbl1_h','p0');
完成后,查看表的分区权重信息。
obclient(root@mysql001)[test]> SELECT * FROM oceanbase.DBA_OB_OBJECT_BALANCE_WEIGHT;查询结果如下:
+----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ | TABLE_ID | PARTITION_ID | SUBPARTITION_ID | WEIGHT | DATABASE_NAME | TABLE_NAME | PARTITION_NAME | SUBPARTITION_NAME | TABLEGROUP_NAME | DATABASE_ID | TABLEGROUP_ID | OBJECT_ID | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ | 500002 | NULL | NULL | 1 | test | tbl1_h | NULL | NULL | NULL | 500001 | NULL | 500002 | | 500002 | 500003 | NULL | 2 | test | tbl1_h | p0 | NULL | NULL | 500001 | NULL | 500003 | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ 2 rows in set
Oracle 模式下设置分区权重
用户登录集群的 Oracle 租户。
连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -usys@oracle001#obdemo -p***** -A(可选)创建待设置分区权重的表。
例如,创建一个 Hash 分区表
TBL1_H。obclient(SYS@oracle001)[SYS]> CREATE TABLE TBL1_H(col1 INT,col2 VARCHAR(50)) PARTITION BY HASH(col1) PARTITIONS 5;(可选)获取表的分区信息。
obclient(SYS@oracle001)[SYS]> SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'TBL1_H';查询结果如下:
+------------+----------------+ | TABLE_NAME | PARTITION_NAME | +------------+----------------+ | TBL1_H | P4 | | TBL1_H | P3 | | TBL1_H | P2 | | TBL1_H | P1 | | TBL1_H | P0 | +------------+----------------+ 5 rows in set根据业务需求,选择合适的级别,设置分区权重。
分区权重仅支持整数,取值范围为 [1, +∞)。默认情况下,分区没有权重。
设置表级权重
支持设置分区表或非分区表的表级分区权重。例如,设置分区表
TBL1_H的分区权重为 1,语句如下。obclient(SYS@oracle001)[SYS]> delimiter //obclient(SYS@oracle001)[SYS]> BEGIN DBMS_BALANCE.SET_BALANCE_WEIGHT(1,'SYS','TBL1_H'); END;//obclient(SYS@oracle001)[SYS]> delimiter ;设置一级分区级权重
设置表
TBL1_H的一级分区P0分区权重为 2,语句如下。obclient(SYS@oracle001)[SYS]> delimiter //obclient(SYS@oracle001)[SYS]> BEGIN DBMS_BALANCE.SET_BALANCE_WEIGHT(2,'SYS','TBL1_H','P0'); END;//obclient(SYS@oracle001)[SYS]> delimiter ;
完成后,查看表的分区权重信息。
obclient(SYS@oracle001)[SYS]> SELECT * FROM SYS.DBA_OB_OBJECT_BALANCE_WEIGHT;查询结果如下:
+----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ | TABLE_ID | PARTITION_ID | SUBPARTITION_ID | WEIGHT | DATABASE_NAME | TABLE_NAME | PARTITION_NAME | SUBPARTITION_NAME | TABLEGROUP_NAME | DATABASE_ID | TABLEGROUP_ID | OBJECT_ID | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ | 500002 | NULL | NULL | 1 | SYS | TBL1_H | NULL | NULL | NULL | 201006 | NULL | 500002 | | 500002 | 500003 | NULL | 2 | SYS | TBL1_H | P0 | NULL | NULL | 201006 | NULL | 500003 | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ 2 rows in set
后续操作
设置分区权重后,如果需要期望进行分区权重均衡,可以调用 DBMS_BALANCE.TRIGGER_PARTITION_BALANCE 子程序,手动触发一次分区均衡,有关手动触发分区均衡的详细操作,参见手动触发分区均衡。
或者,也可以等待定时分区均衡任务的触发。有关定时分区均衡任务的相关信息,参见 配置定时分区均衡任务。
相关文档
有关分区权重的应用案例,参见 租户内均衡 中的 分区权重均衡的应用。