首批通过分布式安全可靠测评,为关键业务系统打造
窗口合并
更新时间:2026-05-22 08:17:25
窗口合并(Window Compaction)是 OceanBase 数据库引入的一种全新的合并形式,它由系统在指定的时间窗口内自动调度执行。窗口合并主要适用于分区数量巨大、增量数据分布不均、业务有明显高峰期低谷期,且需要精细化控制合并资源避免影响业务性能的场景。
对于 V4.6.x 版本,OceanBase 数据库从 V4.6.0 版本开始支持窗口合并。相较于现有的租户合并,窗口合并不会对所有的表都发起合并,而是按需地对有增量数据或者满足特定合并条件的分区发起合并。窗口合并的合并任务仅在指定的时间段内发起。达到预设的执行时长后,系统将自动切换回常规的自适应合并模式,从而保证了合并时间与资源占用的可控性。
更进一步地,在开启了 cgroup 的 OceanBase 集群中,OceanBase 数据库允许用户为窗口合并配置专门的资源计划,给合并窗口期的合并任务分配更多的 CPU/IO 资源,充分利用空闲时间进行数据整理工作。
背景信息
窗口合并本质上调度的是分区级合并。在窗口合并期间,系统会收集各个分区的统计信息,并对每个分区进行评分。相关的评分因子包括:
增量行数 (inc_row_cnt)
距离上次合并的天数
表的查询频率(热度)
SSTable 数量
进行窗口合并调度时,系统会尽量按从高优先级到低优先级的顺序调度,并按批次调度,限制租户内最多未执行的合并任务的数量,从而让合并任务的数量和结束时间可控。
使用限制及注意事项
窗口合并不支持主表和索引表的数据校验。
同一时间内,租户合并与窗口合并只能存在一个,并且租户合并可以打断窗口合并,但是租户合并执行期间不能调度窗口合并。
窗口合并期间,如果将配置项 enable_window_compaction 的值修改为
False(enable_window_compaction = False),则窗口合并会立即停止。租户合并期间,如果将配置项 enable_window_compaction 的值修改为
True(enable_window_compaction = True),则窗口合并的发起需要等待每日合并执行结束。窗口合并期间,不能通过
ALTER SYSTEM SET语句修改租户级配置项 compaction_low_thread_score 的值,否则系统会报错。如果需要调整窗口合并的线程数,使用DBMS_DAILY_MAINTENANCE.SET_THREAD_COUNT()进行设置。
前提条件
触发合并前,需要确保全局合并开关已开启,全局合并开关由集群级配置项 enable_major_freeze 控制,默认值为
True,表示开启合并开关。如果当前集群未开启全局合并开关,请参考以下操作开启全局合并开关。
使用
root用户登录集群的sys租户。确认全局合并开关是否已开启。
obclient(root@sys)[(none)]> SHOW PARAMETERS LIKE 'enable_major_freeze';如果显示未开启,执行以下语句,开启合并开关。
obclient(root@sys)[(none)]> ALTER SYSTEM SET enable_major_freeze='True';
如果需要触发窗口合并,需要确保租户级配置项 enable_window_compaction 为
True,即开启窗口合并。具体操作如下:
租户管理员登录集群的 MySQL 租户或 Oracle 租户。
确认租户级配置项
enable_window_compaction的值。obclient> SHOW PARAMETERS LIKE 'enable_window_compaction';如果值为
False,执行以下语句,开启窗口合并。obclient> ALTER SYSTEM SET enable_window_compaction = True;系统租户下,可以通过指定租户名的方式进行设置,例如:
ALTER SYSTEM SET enable_window_compaction = True TENANT = tenant_name;。
配置周期性触发窗口合并
类似于每日统计信息的收集,对于当前版本的每个用户租户,都在定时任务调度器 DBMS_SCHEDULER 中注册了 DAILY_MAINTENANCE_WINDOW 任务,用户可以根据业务需要,灵活定义窗口合并任务的开启或关闭、触发时间、执行时长等。
启用窗口合并任务
触发窗口合并需要用户手动启用窗口合并任务。
租户管理员登录集群的 MySQL 租户或 Oracle 租户。
连接示例如下,连接数据库时以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A调用
DBMS_SCHEDULER系统包的ENABLE子程序,启用窗口合并。MySQL 模式与 Oracle 模式下的执行语句相同,示例如下:
obclient> CALL DBMS_SCHEDULER.ENABLE('DAILY_MAINTENANCE_WINDOW');
启用窗口合并任务后,默认窗口合并的开始时间为凌晨 02:00,持续时间为 6 小时,周期为每天。
修改窗口合并任务下次开始的时间
启用窗口合并任务后,默认下次窗口合并任务的执行开始时间为凌晨 02:00,用户可以根据业务需要,配置窗口合并任务下次开始的时间。
注意
窗口合并默认一天一次,如果修改了下次执行的时间,例如,修改为凌晨 01:00,则之后为每天凌晨 01:00 执行窗口合并,而不再是凌晨 02:00。
租户管理员登录集群的 MySQL 租户或 Oracle 租户。
连接示例如下,连接数据库时以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A调用
DBMS_SCHEDULER系统包的SET_ATTRIBUTE子程序,设置窗口合并任务下次开始的时间。语句如下:
CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW','NEXT_DATE', 'next_time');语句中,
next_time用于指定窗口合并任务下次开始的时间。示例如下:
MySQL 模式Oracle 模式例如,MySQL 模式模式下,设置窗口合并下次开始的时间为
2026-03-10 01:00:00。obclient(root@mysql001)[(none)]> CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW', 'NEXT_DATE', '2026-03-10 01:00:00');Oracle 模式下,设置窗口合并下次开始的时间为
2026-03-10 01:00:00。obclient(SYS@oracle001)[SYS]> CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW', 'NEXT_DATE', '10-MAR-2026 01:00:00 AM');
配置窗口合并任务的时长
启用窗口合并任务后,默认窗口合并任务的执行时长为 6 小时,用户可以根据业务需要,适当调整执行时长。
租户管理员登录集群的 MySQL 租户或 Oracle 租户。
连接示例如下,连接数据库时以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A调用
DBMS_SCHEDULER系统包的SET_ATTRIBUTE子程序,设置窗口合并任务的执行时长。语句如下:
CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW', 'DURATION', duration);语句中,
duration用于指定窗口合并任务的执行时长,单位为秒。注意
- 修改当前任务的执行时长会影响正在执行的任务本身。例如,调小
duration的值将会导致当前正在执行的窗口合并任务提前结束。 - 由于窗口合并每天调度一次,要求
duration的值需要设置为小于 24 小时(86400)。
例如,设置窗口合并任务的时长为 10 小时,即 36000 秒。MySQL 模式与 Oracle 模式下的执行语句相同,示例如下:
obclient> CALL DBMS_SCHEDULER.SET_ATTRIBUTE('DAILY_MAINTENANCE_WINDOW', 'DURATION', 36000);- 修改当前任务的执行时长会影响正在执行的任务本身。例如,调小
调整窗口合并的线程数
窗口合并期间,其合并线程数不受租户级配置项 compaction_low_thread_score 控制,而是由 DBMS_DAILY_MAINTENANCE.SET_THREAD_COUNT 子程序中的 thread_count 控制,其默认值为 0,表示由系统按照租户相关配置自适应计算合并线程数。用户也可以根据业务需要,调整窗口合并的线程数。
租户管理员登录集群的 MySQL 租户或 Oracle 租户。
连接示例如下,连接数据库时以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A调用
DBMS_DAILY_MAINTENANCE系统包的SET_THREAD_COUNT子程序,设置窗口合并专用的合并线程数。语句如下:
DBMS_DAILY_MAINTENANCE.SET_THREAD_COUNT(thread_count);例如,设置窗口合并的后台合并线程 COMPACTION_LOW 的线程数为 8。MySQL 模式与 Oracle 模式下的执行语句相同,示例如下:
obclient> CALL DBMS_DAILY_MAINTENANCE.SET_THREAD_COUNT(8);
(可选)配置窗口合并的资源管理计划
在开启了 cgroup 的集群上,窗口合并支持在合并期间切换到特定的资源管理计划,从而给合并任务提供更多的合并资源,让合并能够更快地执行,并覆盖充分多的分区,以确保业务高峰期时对分区操作的效率。
租户管理员登录集群的 MySQL 租户或 Oracle 租户。
调用
DBMS_RESOURCE_MANAGER系统包中的CREATE_CONSUMER_GROUP子程序,创建窗口合并专用资源组。注意
窗口合并的资源租名称
INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP为固定名称,不能随意变更。MySQL 模式与 Oracle 模式下的执行语句相同,示例如下:
obclient> CALL DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP( CONSUMER_GROUP => 'INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP', COMMENT => 'consumer group for daily window maintenance job' );调用
DBMS_RESOURCE_MANAGER系统包中的CREATE_PLAN子程序,创建窗口合并专用资源计划。注意
窗口合并的资源管理计划名称
INNER_DAILY_WINDOW_PLAN为固定名称,不能随意变更。MySQL 模式与 Oracle 模式下的执行语句相同,示例如下:
obclient> CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN( PLAN => 'INNER_DAILY_WINDOW_PLAN', COMMENT => 'plan for daily window maintenance job' );调用
DBMS_RESOURCE_MANAGER系统包中的CREATE_PLAN_DIRECTIVE子程序,创建资源管理计划对应的资源管理计划内容。MySQL 模式与 Oracle 模式下的执行语句相同,示例如下:
obclient> CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( PLAN => 'INNER_DAILY_WINDOW_PLAN', GROUP_OR_SUBPLAN => 'INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP', COMMENT => 'directive for window compaction', MAX_IOPS => 100, MIN_IOPS => 30, WEIGHT_IOPS => 50, UTILIZATION_LIMIT => 100, MGMT_P1 => 70 );
配置成功后,当窗口合并任务开始执行时,系统会自动将当前的资源管理计划切换为窗口合并专用的资源计划 INNER_DAILY_WINDOW_PLAN,并将当前 COMPACTION_LOW 的 Function 线程(后台合并任务线程)的资源映射到窗口合并专用资源组 INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP 上。
注意
配置窗口合并的资源管理计划后,在窗口合并期间,需要注意以下事项:
- 不能删除窗口合并专用的资源计划
INNER_DAILY_WINDOW_PLAN和窗口合并专用资源组INNER_DAILY_WINDOW_COMPACTION_LOW_GROUP。 - 不能修改该租户下的所有资源管理计划。
手动触发窗口合并
启用窗口合并任务后,如果还未到窗口合并任务指定的执行时间,用户可以根据业务需要,手动触发窗口合并。
注意
- 仅允许用户租户手动触发窗口合并,系统租户(
sys租户)不支持手动触发窗口合并。 - 手动触发窗口合并的语句执行成功后,如果该时间内仍存在未完成的租户合并,则窗口合并将无法发起。
- 手动触发的窗口合并任务的执行时长同样受
DBMS_SCHEDULER.SET_ATTRIBUTE子程序中窗口合并任务(DAILY_MAINTENANCE_WINDOW)的duration参数的控制,具体配置参见本文 配置窗口合并任务的时长。
租户管理员登录集群对应的 MySQL 租户或 Oracle 租户。
连接示例如下,连接数据库时以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A调用
DBMS_DAILY_MAINTENANCE系统包的TRIGGER_WINDOW_COMPACTION_PROC子程序,手动触发一次窗口合并。MySQL 模式与 Oracle 模式下的执行语句相同,示例如下:
obclient> CALL DBMS_DAILY_MAINTENANCE.TRIGGER_WINDOW_COMPACTION_PROC();
禁用窗口合并任务
如果不期望再触发窗口合并,可以调用 DBMS_SCHEDULER 系统包的 DISABLE 子程序禁用窗口合并任务。
租户管理员登录集群的 MySQL 租户或 Oracle 租户。
连接示例如下,连接数据库时以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A调用
DBMS_SCHEDULER系统包的DISABLE子程序,禁用窗口合并。MySQL 模式与 Oracle 模式下的执行语句相同,示例如下:
obclient> CALL DBMS_SCHEDULER.DISABLE('DAILY_MAINTENANCE_WINDOW');
禁用窗口合并任务后,系统将无法再触发窗口合并(触发周期性窗口合并、手动触发一次窗口合并等均不可以)。此外,如果租户级配置项 enable_window_compaction 的值仍为 True,则系统既不会触发窗口合并,也不会触发每日租户合并。如果期望在禁用窗口合并任务后执行每日租户合并,则需要将租户级配置项 enable_window_compaction 的值设置为 False。开启每日租户合并的详细操作,参见 定时触发每日租户合并。
配置项 enable_window_compaction 和窗口合并任务 DAILY_MAINTENANCE_WINDOW 的取值与每日合并行为之间的关系如下:
| enable_window_compaction | DAILY_MAINTENANCE_WINDOW | 每日合并行为 |
|---|---|---|
| False | False(CALL DBMS_SCHEDULER.DISABLE('DAILY_MAINTENANCE_WINDOW');) |
触发每日租户合并 |
| False | True(CALL DBMS_SCHEDULER.ENABLE('DAILY_MAINTENANCE_WINDOW');) |
触发每日租户合并 |
| True | False (CALL DBMS_SCHEDULER.DISABLE('DAILY_MAINTENANCE_WINDOW');) |
不触发任何合并,即既不触发窗口合并,也不触发每日租户合并 |
| True | True(CALL DBMS_SCHEDULER.ENABLE('DAILY_MAINTENANCE_WINDOW');) |
触发窗口合并 |