首批通过分布式安全可靠测评,为关键业务系统打造
动态分区管理机制与使用指南
更新时间:2026-07-07 13:01
总结说明
在按时间序列持续写入数据(如系统日志、交易流水)的场景下,OceanBase 允许表根据预设的动态分区策略(DYNAMIC_PARTITION_POLICY)自动预创建新分区并删除过期分区,从而实现时序数据的自动化生命周期管理与运维简化。
详细说明
概念定义与使用场景
动态分区管理是 OceanBase 内置的自动化分区维护特性,适用于日志、交易记录等按时间序列存储数据的场景。通过配置步长、预创建时间等策略,由后台 Job(DBMS_SCHEDULER)定期执行 DDL,自动补充未来分区并清理历史过期分区。
使用方法与核心参数
在建表或通过 ALTER TABLE 修改表时,可以指定 DYNAMIC_PARTITION_POLICY 块。具体语法与参数示例如下:
CREATE TABLE tbl1 (col1 DATETIME)
DYNAMIC_PARTITION_POLICY(
ENABLE = true, -- 开启动态分区功能
TIME_UNIT = 'hour', -- 分区步长(hour/day/week/month/year),设定后不可改
PRECREATE_TIME = '3 hour', -- 预建未来多长时间的分区,建议设大以防调度失败导致无分区可写
EXPIRE_TIME = '1 day', -- 分区过期时间,超过该时间的分区将被自动 DROP
TIME_ZONE = '+8:00' -- 依赖的时区信息,建议显式指定,设定后不可改
)
PARTITION BY RANGE COLUMNS (col1)(
PARTITION P0 VALUES LESS THAN ('2026-01-15 18:10:00')
);
普通表也可以通过 ALTER TABLE tbl SET DYNAMIC_PARTITION_POLICY = (...) 在线转为动态分区表,或设置 ENABLE = false 关闭该功能。
运行机制与内部表现
以配置了 TIME_UNIT = 'hour' 的表为例,其在系统中的运行表现如下:
- 调度触发机制:并非实时触发。系统内置
SCHEDULED_MANAGE_DYNAMIC_PARTITION_HOURLY(整点调度)和SCHEDULED_MANAGE_DYNAMIC_PARTITION_DAILY(每天 0 点调度)两个定时任务。刚建完表时分区不会立刻增加,需等待下一次调度或通过CALL DBMS_PARTITION.MANAGE_DYNAMIC_PARTITION();手动触发。 - 历史断档修补表现:若系统停机、人为禁用调度任务一段时间,或最大分区上界落后于当前时间,当调度重新触发时,系统会自动将断档的历史分区补全,其全过程会记录在成功列表内。
- Schema 变更异常表现:若人为修改了分区键列的类型(例如将
datetime强转为int),导致表 Schema 不再满足动态分区限制,后续的调度任务会静默失败。手动调用管理包不报错,但查询历史记录视图(DBA_OB_TENANT_EVENT_HISTORY)时,该表的 ID 会出现在FAILED_TABLE_ID_LIST中,而不再预创建新分区。
监控视图
- 配置查询:
oceanbase.DBA_OB_DYNAMIC_PARTITION_TABLES(或V$动态性能视图)。 - 调度历史查询:
oceanbase.DBA_OB_TENANT_EVENT_HISTORY(过滤EVENT = 'MANAGE_DYNAMIC_PARTITION'),可查看成功和失败的表 ID(SUCCESS_TABLE_ID_LIST/FAILED_TABLE_ID_LIST)。
注意事项
- 删除过期分区属于 DROP 操作,会导致全局索引失效,带有全局索引的表需谨慎使用
EXPIRE_TIME。 - 调度失败不会自动重试,建议
PRECREATE_TIME尽量设置大一些(单次最多建 2048 个分区)。 - 集群升级期间禁止 DDL,调度会暂停,升级前需提前人工预建足够的覆盖窗口分区。
- 初期配置建议先不设置清理过期分区(即暂不配置
EXPIRE_TIME),以灰度策略观察预建功能稳定后再做清理。
适用版本
OBServer V4.3.5 BP2(oceanbase-4.3.5.2-102000162025051417) 及以上版本。