---
title: "表组权重均衡应用案例 - OceanBase 数据库 V4.4.2 | OceanBase 文档中心"
description: 表组权重均衡应用案例 本节通过几个典型场景来介绍表组权重均衡在日常业务中的应用。 场景一：同 Database 下新建表的自动聚合 场景说明 业务上需要新建一批用户表，且需要按 Database 来管理这些用户表，避免 Database 内的分布式读写。 操作步骤 可以先开启新建 Database 下用户表的自动聚合…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.4.2 LTS

# 表组权重均衡应用案例

更新时间：2026-04-29 11:11:45

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.4.2/zh-CN/600.manage/350.load-balancing-manage/430.tablegroup-weight-management/400.tablegroup-balancing-application-cases.md)  

本节通过几个典型场景来介绍表组权重均衡在日常业务中的应用。

## 场景一：同 Database 下新建表的自动聚合

### 场景说明

业务上需要新建一批用户表，且需要按 Database 来管理这些用户表，避免 Database 内的分布式读写。

### 操作步骤

可以先开启新建 Database 下用户表的自动聚合开关（配置项 `enable_database_sharding_none` 的值为 `True`），然后再分别创建 Database 和表。具体操作如下：

1. MySQL 模式租户的租户管理员连接数据库。

   连接示例如下，连接数据库时请以实际环境为准。

   ```shell
   obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A

   ```
 2. 将租户级配置项 `enable_database_sharding_none` 的值设置为 `True`。

   ```shell
   obclient(root@mysql001)[(none)]> ALTER SYSTEM SET enable_database_sharding_none = True;

   ```
 3. 按需创建多个 Database。

   每个 Database 创建成功后，均会默认绑定一个新的 `Sharding = 'NONE'` 的表组。

   创建 Database 的详细操作及说明，参见 [创建数据库](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005283597)。
 4. 按 Database 分批新建用户表，同一个 Database 下的用户表就会自动绑定到一个日志流上。

## 场景二：多个 Database 下新建表的聚合

### 场景说明

业务上需要新建一批用户表，且这些表与另外一个 Database A 下的用户表关联紧密（假设 Database A 在创建时已绑定一个 `Sharding = 'NONE'` 的表组），现在需要将新建的表与 Database A 下的用户表聚合，避免多个 Database 之间的分布式读写。

### 操作步骤

可以创建一个 Database B 与 Database A 绑定到同一个 `Sharding = 'NONE'` 的表组，然后再新建表。具体操作如下：

   ```
 2. 获取 Database A 绑定的表组信息。

   ```shell
   obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_DATABASES WHERE DATABASE_NAME = 'databse_name';

   ```
 3. 使用以下语句创建一个新的 Database B，并指定其表组为 Database A 绑定的表组。

   ```sql
   CREATE DATABASE databae_name DEFAULT tablegroup = tablegroup_name;

   ```

   有关 `CREATE DATABASE` 语句的详细说明及示例，参见 [CREATE DATABASE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005286473)。
 4. 在新建的 Database B 下新建用户表，新建的用户表就会与 Database A 下的用户表自动绑定到同一个日志流上。

## 场景三：多个 Database 的重新聚合

### 场景说明

用户表已经创建完成，现在需要将关联的多个 Database 下的用户表重新聚合，避免多个 Database 之间的分布式读写。

### 操作步骤

1. MySQL 模式租户的租户管理员连接数据库。

   ```
 2. 使用以下语句，创建一个 `Sharding = 'NONE'` 的表组。

   ```sql
   CREATE TABLEGROUP tablegroup_name Sharding = 'NONE';

   ```
 3. 使用以下语句，将多个 Database 绑定到新建的表组中。

   ```sql
   ALTER DATABASE database_name tablegroup [=] tablegroup_name;

   ```

   有关 `ALTER DATABASE` 语句的详细说明及示例，参见 [ALTER DATABASE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005286456)。
 4. 手动触发分区均衡。

   ```shell
   obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.TRIGGER_PARTITION_BALANCE();

   ```

   手动触发分区均衡的详细操作，参见 [手动触发分区均衡](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005282864)。
 5. 等待分区均衡任务完成，即可完成多个 Database 下用户表的聚合。

   分区均衡过程中，可以通过视图来查看均衡任务的进度，语句如下：

   ```shell
   obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOBS WHERE JOB_TYPE = 'PARTITION_BALANCE';

   ```

   查看分区均衡任务进度的详细操作，参见 [查看后台的分区均衡任务](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005282865)。

## 场景四：热点表组独占

### 场景说明

开启新建 Database 下用户表的自动聚合开关（配置项 `enable_database_sharding_none` 的值为 `True`）后，每创建一个 Database 同时就会默认创建一个 `Sharding = 'NONE'` 的表组（该方式创建的表组的权重默认为 `1`），现根据业务需要，期望热点表组独占日志流。

### 操作步骤

假设当前租户有 9 个 `Sharding = 'NONE'` 表组 `TG_DB_1`～`TG_DB_9`。其中，`TG_DB_1` 由于聚合了多个 Database 的用户表，成为热点表组，期望独占一个日志流。

当前，这些表组的权重分布如下所示。

![表组权重初始分布](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V4.4.1/3.load-balance/hot-tablegroup-alone1.png)

可以按大权重（100% * `Sharding = 'NONE'` 的表组的总数）来设置热点表组 `TG_DB_1`的权重，即可实现独占。具体操作如下：

   ```
 2. 确认租户下带权重的 `Sharding = 'NONE'` 的表组的总数。

   ```shell
   obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_OBJECT_BALANCE_WEIGHT;  

   ```
 3. 为热点表组设置权重。

   假设查询出来带权重的 `Sharding = 'NONE'` 的表组的总数为 9，则设置热点表组的权重为 9 的语句如下：

   ```shell
   obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(9,'TG_DB_1');

   ```
 4. 手动触发分区均衡。

   ```

   ```

均衡完成后，这些表组的权重分布如下：

![热点表组独占分布](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V4.4.1/3.load-balance/hot-tablegroup-alone2.png)

## 场景五：表组按权重分布

### 场景说明

开启新建 Database 下用户表的自动聚合开关（配置项 `enable_database_sharding_none` 的值为 `True`）后，每创建一个 Database 同时就会默认创建一个 `Sharding = 'NONE'` 的表组（该方式创建的表组的权重默认为 `1`），现根据业务需要，期望打散用户表较多或数据量较大或访问流量较大的表组。

### 操作步骤

假设当前租户有 9 个 `Sharding = 'NONE'` 表组 `TG_DB_1`～`TG_DB_9`。其中，`TG_DB_1`、`TG_DB_2`、`TG_DB_4` 几个表组中表的数据量较大，但不足以独占一个日志流。

![表组权重初始分布2](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V4.4.1/3.load-balance/tablegroup-balance-weight1.png)

可以按中权重（50% * `Sharding = 'NONE'` 的表组的总数）来设置 `TG_DB_1`、`TG_DB_2`、`TG_DB_4` 这些表组的权重。具体操作如下：

   ```
 3. 为表组 `TG_DB_1`、`TG_DB_2`、`TG_DB_4` 设置权重。

   假设查询出来带权重的 `Sharding = 'NONE'` 的表组的总数为 9，则分别为表组 `TG_DB_1`、`TG_DB_2`、`TG_DB_4` 设置权重为 4（`50% * 9` 的结果向下取整）的语句如下：

   ```shell
   obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(4,'TG_DB_1');

   ```

   ```shell
   obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(4,'TG_DB_2');

   ```

   ```shell
   obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(4,'TG_DB_4');

   ```

   ```

![表组权重最终分布](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V4.4.1/3.load-balance/tablegroup-balance-weight2.png)

## 场景六：`SHARDING = 'NONE'` 且 `SCOPE = 'ZONE'` 的表组权重的应用

### 场景说明

业务如果需要一组用户表聚合在某个 Zone，避免跨 Zone 的分布式读写，可以将这些用户表加入 `SHARDING = NONE` + `SCOPE = ZONE` 的表组。如果需要配置多个 `SHARDING = NONE` + `SCOPE = ZONE` 表组，且不同表组的访问流量差别较大，可以设置表组级权重。

### 操作步骤

在用户表已经创建的情况下，如果需要修改表组属性，配置 `SHARDING = NONE` + `SCOPE = ZONE` 表组，可以参考以下步骤：

   ```
 2. 将租户级配置项 `enable_transfer` 的值设置为 `False`，关闭 Transfer 功能。

   ```shell
   obclient(root@mysql001)[(none)]> ALTER SYSTEM SET enable_transfer = False;

   ```
 3. 对于每组用户表，各创建一个 `SHARDING = 'NONE'` + `SCOPE = 'ZONE'` 的表组，并将对应的表加入表组。

   创建一个表组并将表加入表组的示例语句如下：

   ```shell
   obclient(root@mysql001)[test]> CREATE TABLEGROUP TG_DB_1 SHARDING = 'NONE', SCOPE = 'ZONE';

   ```

   ```shell
   obclient(root@mysql001)[test]> ALTER TABLEGROUP TG_DB_1 ADD tbl1,tbl2;

   ```

   创建表组并将表加入表组的详细操作，参见 [创建表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005283619) 和 [将表添加到表组](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005283618)。
 4. 为热点表组设置权重。

   语句示例如下：

   ```shell
   obclient(root@mysql001)[test]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(10,'TG_DB_1');

   ```

   为表组设置权重的详细操作，参见 [设置表组权重](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005282863)。
 5. 为每个热点表组选择需要分布的 Zone，并确保热点表组的 `table_id` 最小的表位于目标 Zone 上，可通过手动执行 Transfer Partition 调整分区 Leader 到目标 Zone 来实现。选择 Zone 的依据如下：

      - 每个热点表组选择的 Zone 各不相同，避免热点聚集在同一 Zone 上。
      - 热点表组内大多数表已处于目标 Zone 上，减少表组中分区 Leader 对齐到同一 Zone 所需要 Transfer 的分区数。
 6. （可选）对于其他非热点表组，调整其中 `table_id` 最小的表，与表组内大多数表保持在同 Zone 内。
 7. 将租户级配置项 `enable_transfer` 的值设置为 `True`，重新开启 Transfer 功能。

   ```shell
   obclient(root@mysql001)[(none)]> ALTER SYSTEM SET enable_transfer = True;

   ```
 8. 手动触发一轮分区均衡。

   ```

   手动触发分区均衡的详细操作，参见 [手动触发分区均衡](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005282864)。

   执行成功后，各表组内的分区会自动先与 `table_id` 最小的表对齐，然后再做 Zone 间的权重、数量和磁盘均衡。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
