首批通过分布式安全可靠测评,为关键业务系统打造
手动触发合并
更新时间:2026-06-17 08:53:22
合并也可以通过手动触发来完成。手动合并包括租户级合并、表级合并和分区级合并。
自适应合并实际调度的就是分区级合并,只是由系统适时地对有需求的分区发起分区合并任务。同时,分区级合并的使用场景与自适应合并解决的场景相同,即主要针对导数、频繁 DML、查询效率低等场景,有关自适应合并的详细介绍,请参见 自适应合并。如果您因业务需要关闭了自适应合并功能,遇到查询慢等问题,您可以使用手动方式发起分区级合并来解决这些问题。
使用限制及注意事项
分区与 Tablet 一一对应,在进行分区级合并时,需要注意以下事项:
当对应的分区正在执行租户级合并任务时,无法发起分区级合并。
当对应的分区正在执行自适应调度的合并任务时,无法发起分区级合并。
当对应分区的多副本处于不一致状态时,无法发起分区级合并。
当对应分区处于恢复中或 Transfer 状态时,无法发起分区级合并。
当合并任务被暂停时,不允许发起分区级合并。
分区级合并的实质为对同一分区的多个副本执行 Major Compaction 任务,会消耗 CPU 及磁盘 I/O。在执行分区级合并操作前,您需要权衡当前租户的资源占用情况,并且当分区级合并命令执行成功后,会出现 CPU、I/O 占用升高的情况。
表级合并是指对某个租户下的某个表的所有分区发起分区合并命令。表级合并有以下使用限制:
仅支持对数据存储在数据库内部的用户表发起表级合并。
与分区级合并一样,表级合并为异步任务,不保证一定能发起成功。
前提条件
触发合并前,需要确保全局合并开关已开启,全局合并开关由集群级配置项 enable_major_freeze 控制,默认值为 True,表示开启合并开关。
如果当前集群未开启全局合并开关,请参考以下操作开启全局合并开关。
使用
root用户登录集群的sys租户。确认全局合并开关是否已开启。
obclient> SHOW PARAMETERS LIKE 'enable_major_freeze';如果显示未开启,执行以下语句,开启合并开关。
obclient> ALTER SYSTEM SET enable_major_freeze='True';关于配置项
enable_major_freeze的更多信息,请参见 enable_major_freeze。
系统租户手动发起合并
系统租户可以对本租户、所有租户或指定租户发起合并操作。
具体操作如下:
使用
root用户登录集群的sys租户。执行以下命令,发起合并。
发起租户级别的合并
SQL 语句如下:
ALTER SYSTEM MAJOR FREEZE TENANT [=] all_user | all | all_meta | tenant_name [, tenant_name ...];其中,
[=]表示等号(=)为可选。示例如下:
系统租户对本租户发起合并
obclient> ALTER SYSTEM MAJOR FREEZE;系统租户对所有用户租户发起合并
obclient> ALTER SYSTEM MAJOR FREEZE TENANT = all_user;或者
obclient> ALTER SYSTEM MAJOR FREEZE TENANT = all;说明
OceanBase 数据库从 V4.2.1 版本开始,
TENANT = all_user与TENANT = all语义相同,在需要生效范围为所有用户租户时,推荐使用TENANT = all_user,后续TENANT = all将废弃不再使用。系统租户对所有 Meta 租户发起合并
obclient> ALTER SYSTEM MAJOR FREEZE TENANT = all_meta;系统租户对指定租户发起合并
obclient> ALTER SYSTEM MAJOR FREEZE TENANT = tenant1,tenant2;
发起表级合并
系统租户对指定租户发起表级合并的 SQL 语句如下:
ALTER SYSTEM MAJOR FREEZE TENANT [=] tenant_name TABLE_ID = table_id;其中,
table_id为表 ID,可以由系统租户通过查询视图CDB_OB_TABLE_LOCATIONS来获取。有关视图CDB_OB_TABLE_LOCATIONS中各字段的详细介绍,请参见 oceanbase.CDB_OB_TABLE_LOCATIONS。系统租户对租户
tenant1发起表级合并的示例如下:系统租户获取待合并的表 t1 的
table_id。obclient(root@sys)[oceanbase]> SELECT a.tenant_id, b.tenant_name, a.database_name, a.table_id, a.table_name FROM oceanbase.CDB_OB_TABLE_LOCATIONS a, oceanbase.DBA_OB_TENANTS b WHERE a.tenant_id=b.tenant_id AND a.table_name = 't1' AND b.tenant_name = 'tenant1';查询结果如下:
+-----------+-------------+---------------+----------+------------+ | tenant_id | tenant_name | database_name | table_id | table_name | +-----------+-------------+---------------+----------+------------+ | 1002 | tenant1 | test | 500002 | t1 | +-----------+-------------+---------------+----------+------------+ 1 row in set执行以下命令,发起表级合并。
obclient(root@sys)[oceanbase]> ALTER SYSTEM MAJOR FREEZE TENANT = tenant1 TABLE_ID = 500002;
发起分区级的合并
系统租户对指定租户发起分区级的合并的 SQL 语句如下:
ALTER SYSTEM MAJOR FREEZE TENANT [=] tenant_name TABLET_ID = tablet_id;其中,
tablet_id可以由系统租户通过查询视图CDB_OB_TABLE_LOCATIONS来获取。有关视图CDB_OB_TABLE_LOCATIONS中各字段的详细介绍,请参见 oceanbase.CDB_OB_TABLE_LOCATIONS。系统租户对租户
tenant1发起分区级合并的示例如下:系统租户获取待合并的表 t1 的分区对应的
tablet_id。obclient(root@sys)[oceanbase]> SELECT a.tenant_id, b.tenant_name, a.database_name, a.table_id, a.table_name, a.tablet_id, a.partition_name, a.subpartition_name FROM oceanbase.CDB_OB_TABLE_LOCATIONS a, oceanbase.DBA_OB_TENANTS b WHERE a.tenant_id=b.tenant_id AND a.table_name = 't1' AND b.tenant_name = 'tenant1';查询结果如下:
+-----------+-------------+---------------+----------+------------+-----------+----------------+-------------------+ | tenant_id | tenant_name | database_name | table_id | table_name | tablet_id | partition_name | subpartition_name | +-----------+-------------+---------------+----------+------------+-----------+----------------+-------------------+ | 1002 | tenant1 | test | 500010 | t1 | 200007 | p0 | NULL | | 1002 | tenant1 | test | 500010 | t1 | 200008 | p1 | NULL | | 1002 | tenant1 | test | 500010 | t1 | 200009 | p2 | NULL | +-----------+-------------+---------------+----------+------------+-----------+----------------+-------------------+ 3 rows in set执行以下命令,发起分区级合并。
obclient(root@sys)[oceanbase]> ALTER SYSTEM MAJOR FREEZE TENANT = tenant1 TABLET_ID = 200007;
注意
分区级合并命令与租户级合并以及自适应调度策略发起的合并均存在互斥关系,命令执行成功并不代表分区合并发起成功。您可以根据视图
GV$OB_MERGE_INFO查看指定分区中ACTION='MEDIUM_MERGE'的合并信息,或者根据视图GV$OB_TABLET_COMPACTION_HISTORY查看指定分区中TYPE='MEDIUM_MERGE'的合并信息来确认合并是否成功发起。有关查看合并信息的详细操作,请参见 查看合并信息。
用户租户手动发起合并
用户租户只能对本租户发起租户级别和分区级别的合并操作。
用户租户的租户管理员登录到数据库。
对本租户发起租户级合并。
发起本租户的合并
obclient> ALTER SYSTEM MAJOR FREEZE;发起表级合并
用户租户对指定表发起合并的 SQL 语句如下:
ALTER SYSTEM MAJOR FREEZE TABLE_ID = table_id;其中,
table_id表示表 ID,可以通过查询视图DBA_OB_TABLE_LOCATIONS来获取。有关视图DBA_OB_TABLE_LOCATIONS中各字段的详细介绍,参见 DBA_OB_TABLE_LOCATIONS。用户租户对指定表发起合并的示例如下:
获取待合并的表 t1 的
table_id。MySQL 模式Oracle 模式MySQL 模式下的查询语句如下:
obclient(root@tenant1)[oceanbase]> SELECT database_name, table_id, table_name FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE table_name = 't1';查询结果如下:
+---------------+----------+------------+ | database_name | table_id | table_name | +---------------+----------+------------+ | test | 500002 | t1 | +---------------+----------+------------+ 1 row in setOracle 模式下的查询语句如下:
obclient(sys@tenant1)[SYS]> SELECT database_name, table_id, table_name FROM SYS.DBA_OB_TABLE_LOCATIONS WHERE table_name = 'T1';查询结果如下:
+---------------+----------+------------+ | DATABASE_NAME | TABLE_ID | TABLE_NAME | +---------------+----------+------------+ | SYS | 500002 | T1 | +---------------+----------+------------+ 1 row in set执行以下命令,发起表级合并。
obclient> ALTER SYSTEM MAJOR FREEZE TABLE_ID = 500002;
发起分区级别的合并
用户租户对指定分区发起合并的语句如下:
ALTER SYSTEM MAJOR FREEZE TABLET_ID = tablet_id;其中,
tablet_id可以通过查询视图DBA_OB_TABLE_LOCATIONS来获取。有关视图DBA_OB_TABLE_LOCATIONS中各字段的详细介绍,参见 DBA_OB_TABLE_LOCATIONS。用户租户对指定分区发起合并的示例如下:
获取待合并的表 t1 的分区对应的
tablet_id。MySQL 模式Oracle 模式MySQL 模式下的查询语句如下:
obclient(root@tenant1)[oceanbase]> SELECT database_name, table_id, table_name, tablet_id, partition_name, subpartition_name FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE table_name = 't1';查询结果如下:
+---------------+----------+------------+-----------+----------------+-------------------+ | database_name | table_id | table_name | tablet_id | partition_name | subpartition_name | +---------------+----------+------------+-----------+----------------+-------------------+ | test | 500010 | t1 | 200007 | p0 | NULL | | test | 500010 | t1 | 200008 | p1 | NULL | | test | 500010 | t1 | 200009 | p2 | NULL | +---------------+----------+------------+-----------+----------------+-------------------+ 3 rows in setOracle 模式下的查询语句如下:
obclient(sys@tenant1)[SYS]> SELECT database_name, table_id, table_name, tablet_id, partition_name, subpartition_name FROM SYS.DBA_OB_TABLE_LOCATIONS WHERE table_name = 'T1';查询结果如下:
+---------------+----------+------------+-----------+----------------+-------------------+ | DATABASE_NAME | TABLE_ID | TABLE_NAME | TABLET_ID | PARTITION_NAME | SUBPARTITION_NAME | +---------------+----------+------------+-----------+----------------+-------------------+ | SYS | 500010 | T1 | 200007 | P0 | NULL | | SYS | 500010 | T1 | 200008 | P1 | NULL | | SYS | 500010 | T1 | 200009 | P2 | NULL | +---------------+----------+------------+-----------+----------------+-------------------+ 3 rows in set执行以下命令,发起指定分区的合并。
obclient> ALTER SYSTEM MAJOR FREEZE TABLET_ID = 200007;
注意
分区级合并命令与租户级合并以及自适应调度策略发起的合并均存在互斥关系,命令执行成功并不代表分区合并发起成功。用户租户可以根据视图
GV$OB_TABLET_COMPACTION_HISTORY查看指定分区中TYPE='MEDIUM_MERGE'的合并信息来确认合并是否成功发起。有关查看合并信息的详细操作,请参见 查看合并信息。