首批通过分布式安全可靠测评,为关键业务系统打造
动态分区概述
更新时间:2026-07-02 13:29:18
动态分区是 OceanBase 数据库提供的一种自动管理分区的功能,允许表根据预设规则自动创建和删除分区,从而简化运维并适应数据增长或过期的需求。
功能特性
根据
TIME_UNIT(如小时、天、月等)定期创建新分区,确保数据按时间范围自动扩展。- 分区边界基于时间单位(如
hour、day)划分,适用于按时间序列存储数据的场景(如日志、交易记录)。
- 分区边界基于时间单位(如
通过
PRECREATE_TIME预创建未来分区,避免因数据突增导致的分区不足问题。根据
EXPIRE_TIME定期清理过期分区,释放存储空间。支持自定义时区(
TIME_ZONE),确保跨时区数据的一致性。支持
number类型时间戳的精度配置(如BIGINT_PRECISION),适配不同时间精度需求。
预创建分区
在执行动态分区管理时,系统会间隔 TIME_UNIT 创建分区,直到最大分区边界超过 now() + precreate_time,创建的第一个分区边界为现存最大分区边界按 TIME_UNIT 向上取整。
示例如下:
创建表 tbl1:
CREATE TABLE tbl1 (col1 TIMESTAMP)
DYNAMIC_PARTITION_POLICY(
ENABLE = true,
TIME_UNIT = 'hour',
PRECREATE_TIME = '3 hour',
EXPIRE_TIME = '1 day',
TIME_ZONE = '+8:00')
PARTITION BY RANGE (col1)(
PARTITION P0 VALUES LESS THAN (TIMESTAMP '2025-04-20 13:30:00')
);
当前时间为
2025-04-20 12:34:56,调度一次动态分区管理后,分区为:PARTITION P0 VALUES LESS THAN (TIMESTAMP '2025-04-20 13:30:00') PARTITION P2025042013 VALUES LESS THAN (TIMESTAMP '2025-04-20 14:00:00'), PARTITION P2025042014 VALUES LESS THAN (TIMESTAMP '2025-04-20 15:00:00'), PARTITION P2025042015 VALUES LESS THAN (TIMESTAMP '2025-04-20 16:00:00')若现存最大分区边界小于当前时间,预创建分区会尝试补充历史分区。例如现存最大分区为
PARTITION P0 VALUES LESS THAN (TIMESTAMP '2025-04-20 11:30:00'),当前时间为2025-04-20 12:34:56,调度一次动态分区管理后,分区为:PARTITION P0 VALUES LESS THAN (TIMESTAMP '2025-04-20 11:30:00'), PARTITION P2025042011 VALUES LESS THAN (TIMESTAMP '2025-04-20 12:00:00'), PARTITION P2025042012 VALUES LESS THAN (TIMESTAMP '2025-04-20 13:00:00'), PARTITION P2025042013 VALUES LESS THAN (TIMESTAMP '2025-04-20 14:00:00'), PARTITION P2025042014 VALUES LESS THAN (TIMESTAMP '2025-04-20 15:00:00'), PARTITION P2025042015 VALUES LESS THAN (TIMESTAMP '2025-04-20 16:00:00')补充了历史分区
P2025042011。
预创建分区的名字
系统会根据分区边界值和 TIME_UNIT 确定自动生成的分区名,分区名前缀为 P。
| TIME_UNIT | 分区上界 | 分区名 |
|---|---|---|
| hour | 2024-03-04 05:00:00 | P2024030404 |
| day | 2024-03-05 00:00:00 | P20240304 |
| week | 2024-03-11 00:00:00 | P2024_10(ISO 8601 第 10 周) |
| month | 2024-04-01 00:00:00 | P202403 |
| year | 2025-01-01 00:00:00 | P2024 |
删除过期分区
在执行动态分区管理时,系统会根据 EXPIRE_TIME 删除所有 分区上界 < now() - expire_time 的过期分区。
示例如下:
创建表
tbl2。CREATE TABLE tbl2 (col1 TIMESTAMP) DYNAMIC_PARTITION_POLICY( ENABLE = true, TIME_UNIT = 'hour', PRECREATE_TIME = '3 hour', EXPIRE_TIME = '6 hour', TIME_ZONE = '+8:00') PARTITION BY RANGE (col1)( PARTITION P0 VALUES LESS THAN (TIMESTAMP '2025-04-21 08:30:00') );当前时间为
2025-04-21 17:58:06,调度一次动态分区管理后,分区为:PARTITION P0 VALUES LESS THAN (TIMESTAMP '2025-04-21 08:30:00.000000'), PARTITION P2025042108 VALUES LESS THAN (TIMESTAMP '2025-04-21 09:00:00.000000'), PARTITION P2025042109 VALUES LESS THAN (TIMESTAMP '2025-04-21 10:00:00.000000'), PARTITION P2025042110 VALUES LESS THAN (TIMESTAMP '2025-04-21 11:00:00.000000'), PARTITION P2025042111 VALUES LESS THAN (TIMESTAMP '2025-04-21 12:00:00.000000'), PARTITION P2025042112 VALUES LESS THAN (TIMESTAMP '2025-04-21 13:00:00.000000'), PARTITION P2025042113 VALUES LESS THAN (TIMESTAMP '2025-04-21 14:00:00.000000'), PARTITION P2025042114 VALUES LESS THAN (TIMESTAMP '2025-04-21 15:00:00.000000'), PARTITION P2025042115 VALUES LESS THAN (TIMESTAMP '2025-04-21 16:00:00.000000'), PARTITION P2025042116 VALUES LESS THAN (TIMESTAMP '2025-04-21 17:00:00.000000'), PARTITION P2025042117 VALUES LESS THAN (TIMESTAMP '2025-04-21 18:00:00.000000'), PARTITION P2025042118 VALUES LESS THAN (TIMESTAMP '2025-04-21 19:00:00.000000'), PARTITION P2025042119 VALUES LESS THAN (TIMESTAMP '2025-04-21 20:00:00.000000'), PARTITION P2025042120 VALUES LESS THAN (TIMESTAMP '2025-04-21 21:00:00.000000')时间为
2025-04-21 17:58:16,再次调度一次动态分区管理后,分区为:PARTITION P2025042111 VALUES LESS THAN (TIMESTAMP '2025-04-21 12:00:00.000000'), PARTITION P2025042112 VALUES LESS THAN (TIMESTAMP '2025-04-21 13:00:00.000000'), PARTITION P2025042113 VALUES LESS THAN (TIMESTAMP '2025-04-21 14:00:00.000000'), PARTITION P2025042114 VALUES LESS THAN (TIMESTAMP '2025-04-21 15:00:00.000000'), PARTITION P2025042115 VALUES LESS THAN (TIMESTAMP '2025-04-21 16:00:00.000000'), PARTITION P2025042116 VALUES LESS THAN (TIMESTAMP '2025-04-21 17:00:00.000000'), PARTITION P2025042117 VALUES LESS THAN (TIMESTAMP '2025-04-21 18:00:00.000000'), PARTITION P2025042118 VALUES LESS THAN (TIMESTAMP '2025-04-21 19:00:00.000000'), PARTITION P2025042119 VALUES LESS THAN (TIMESTAMP '2025-04-21 20:00:00.000000'), PARTITION P2025042120 VALUES LESS THAN (TIMESTAMP '2025-04-21 21:00:00.000000')可以看到过期分区
P0、P2025042108、P2025042109和P2025042110被删除。
注意事项
V4.6.0 之前版本执行
DROP分区操作将导致全局索引失效。对于存在全局索引的表,谨慎使用删除过期分区功能。V4.6.0 版本新增组户级配置项
_append_update_global_indexes_for_dynamic_partition,用于控制动态分区在清理过期分区时是否自动维护全局索引,取值如下:AUTO:新建租户默认值,跟随_ob_enable_truncate_partition_preserve_global_index取值。适合在希望避免重建全局索引引入额外开销时使用。_ob_enable_truncate_partition_preserve_global_index为true时,追加UPDATE GLOBAL INDEXES,保留全局索引。_ob_enable_truncate_partition_preserve_global_index为false时,不追加UPDATE GLOBAL INDEXES,使全局索引失效。
ON:始终追加UPDATE GLOBAL INDEXES,删除过期分区时根据_ob_enable_truncate_partition_preserve_global_index的取值选择保留全局索引或重建全局索引。适合在希望避免全局索引失效时使用。OFF:升级租户默认值,与低版本行为保持一致,始终不追加UPDATE GLOBAL INDEXES。删除过期分区时会直接使全局索引失效。适合在希望避免重建全局索引或保留全局索引引入额外开销时使用。如果是升级到 V4.6.0 版本的场景,要
DROP分区操作后全局索引不失效,需要修改_ob_enable_truncate_partition_preserve_global_index为true和_append_update_global_indexes_for_dynamic_partition为AUTO或ON,示例如下:obclient> ALTER SYSTEM SET "_ob_enable_truncate_partition_preserve_global_index" = true;obclient> ALTER SYSTEM SET "_append_update_global_indexes_for_dynamic_partition" = 'AUTO';
动态分区管理在调度失败时不会自动重试。为避免因连续调度失败导致新分区无法及时创建,进而造成数据写入失败,建议将
PRECREATE_TIME设置为较大数值。集群升级期间禁止 DDL 操作,动态分区管理将暂停调度。建议根据预估升级时长,提前预建分区,覆盖升级窗口。
修改分区键列类型、修改分区规则后,若新表 Schema 不满足动态分区管理限制,后续动态分区管理在这张表上的调度会失败。
一次调度最多创建 2048 个分区。如果需要补充的历史分区过多,调度多次才能满足预创建时间。
动态分区管理功能需要在后台发送 DDL 进行分区的创建和删除。为避免持续影响其他 DDL 操作,动态分区表数不宜过多。