基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
修改动态分区表
更新时间:2026-09-16 11:04:04
OceanBase 数据库可以通过修改 DYNAMIC_PARTITION_POLICY 块,修改表的动态分区管理属性。
本文将向您介绍如何使用 SQL 语句修改动态分区表。
使用限制及注意事项
修改动态分区管理参数后,预创建分区和删除过期分区不会立刻生效,需要等待下一次动态分区管理任务自动调度,或者手动调度一次动态分区管理任务。调度动态分区管理任务的详细介绍,参见 动态分区管理任务。
TIME_UNIT、TIME_ZONE、BIGINT_PRECISION参数在创建动态分区表时指定,指定后不可修改。修改动态分区策略时是否指定
TIME_UNIT,取决于表是否已启用动态分区管理:- 对于已启用动态分区管理的表,无需指定
TIME_UNIT,也不能在修改语句中指定(指定会报错)。 - 对于尚未启用动态分区管理的表(例如普通分区表),需要在修改语句中指定
TIME_UNIT。
- 对于已启用动态分区管理的表,无需指定
权限要求
修改动态分区表需要有 ALTER 权限。更多有关 OceanBase 数据库权限的详细介绍,参见 MySQL 模式下的权限分类。
语法
修改动态分区表的 SQL 语句格式如下:
ALTER TABLE table_name [SET] DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list);
dynamic_partition_policy_list:
dynamic_partition_policy_option [, dynamic_partition_policy_option ...]
dynamic_partition_policy_option:
ENABLE = {true | false}
| TIME_UNIT = {'hour' | 'day' | 'week' | 'month' | 'year'}
| PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
| EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
说明
TIME_UNIT 在建表时指定,指定后不可修改:修改已启用动态分区管理的表时,不能指定 TIME_UNIT;为尚未启用动态分区管理的表添加动态分区策略时,需要指定 TIME_UNIT。
动态分区管理属性参数说明
| 属性名称 | 描述 | 是否必填 | 是否可修改 |
|---|---|---|---|
| ENABLE | 表示是否启用动态分区管理。取值如下:
|
否 | 是 |
| TIME_UNIT | 表示分区的时间单位,即自动创建分区边界的间隔。取值如下:
说明
|
否 | 否 |
| PRECREATE_TIME | 表示预创建时间。调度一次动态分区管理,会预创建分区使得 最大分区上界 > now() + precreate_time。取值如下:
说明
|
否 | 是 |
| EXPIRE_TIME | 表示分区过期时间。调度一次动态分区管理,会删除所有 分区上界 < now() - expire_time 的过期分区。取值如下:
|
否 | 是 |
更多有关修改表语法的详细参数说明信息,参见 ALTER TABLE。
示例
建表:
CREATE TABLE test_tbl1 (col1 INT, col2 DATETIME) DYNAMIC_PARTITION_POLICY( ENABLE = true, TIME_UNIT = 'hour', PRECREATE_TIME = '3 hour', EXPIRE_TIME = '1 day', TIME_ZONE = '+8:00', BIGINT_PRECISION = 'none' ) PARTITION BY RANGE COLUMNS (col2)( PARTITION P0 VALUES LESS THAN ('2025-04-15 13:30:00') );查看表
test_tbl1的动态分区信息。SELECT * FROM oceanbase.DBA_OB_DYNAMIC_PARTITION_TABLES WHERE TABLE_NAME = 'test_tbl1';查询结果如下:
+---------------+------------+----------+-----------------------+--------+-----------+----------------+-------------+-----------+------------------+ | DATABASE_NAME | TABLE_NAME | TABLE_ID | MAX_HIGH_BOUND_VAL | ENABLE | TIME_UNIT | PRECREATE_TIME | EXPIRE_TIME | TIME_ZONE | BIGINT_PRECISION | +---------------+------------+----------+-----------------------+--------+-----------+----------------+-------------+-----------+------------------+ | db_test | test_tbl1 | 511335 | '2025-04-15 13:30:00' | TRUE | HOUR | 3HOUR | 1DAY | +8:00 | NONE | +---------------+------------+----------+-----------------------+--------+-----------+----------------+-------------+-----------+------------------+ 1 row in set修改动态分区表
test_tbl1,设置动态分区属性为:- 预创建当前时间之后的 1 天内的分区。
- 分区永不过期。
ALTER TABLE test_tbl1 DYNAMIC_PARTITION_POLICY( ENABLE = true, PRECREATE_TIME = '1 day', EXPIRE_TIME = '-1' );再次查看表
test_tbl1的动态分区信息。SELECT * FROM oceanbase.DBA_OB_DYNAMIC_PARTITION_TABLES WHERE TABLE_NAME = 'test_tbl1';查询结果如下:
+---------------+------------+----------+-----------------------+--------+-----------+----------------+-------------+-----------+------------------+ | DATABASE_NAME | TABLE_NAME | TABLE_ID | MAX_HIGH_BOUND_VAL | ENABLE | TIME_UNIT | PRECREATE_TIME | EXPIRE_TIME | TIME_ZONE | BIGINT_PRECISION | +---------------+------------+----------+-----------------------+--------+-----------+----------------+-------------+-----------+------------------+ | db_test | test_tbl1 | 511335 | '2025-04-15 13:30:00' | TRUE | HOUR | 1DAY | -1 | +8:00 | NONE | +---------------+------------+----------+-----------------------+--------+-----------+----------------+-------------+-----------+------------------+ 1 row in set说明
修改动态分区管理参数后,预创建分区和删除过期分区不会立刻生效,需要等待 下一次动态分区管理任务自动调度,或者手动调度一次动态分区管理任务。详细介绍,参见 动态分区管理任务。
为尚未启用动态分区管理的普通 Range Columns 分区表添加动态分区策略。
创建一张普通 Range Columns 分区表
test_tbl3。CREATE TABLE test_tbl3 (col1 INT, col2 DATETIME) PARTITION BY RANGE COLUMNS (col2)( PARTITION P0 VALUES LESS THAN ('2026-09-14 00:00:00') );为
test_tbl3添加动态分区策略,设置动态分区属性为:- 分区边界按天划分。
- 预创建当前时间之后的 3 天内的分区。
- 删除分区上界早于当前时间 30 天前的分区。
ALTER TABLE test_tbl3 DYNAMIC_PARTITION_POLICY( ENABLE = true, TIME_UNIT = 'day', PRECREATE_TIME = '3 day', EXPIRE_TIME = '30 day' );说明
- 为尚未启用动态分区管理的表添加动态分区策略时,需要指定
TIME_UNIT。 - 分区键为时间类型时,
TIME_ZONE的默认值为default,BIGINT_PRECISION的默认值为none,可以省略。
手动触发一次动态分区管理任务,查看预创建的分区。
CALL DBMS_PARTITION.MANAGE_DYNAMIC_PARTITION();查看表
test_tbl3的分区信息:SELECT TABLE_NAME, PARTITION_NAME, PARTITION_DESCRIPTION FROM information_schema.PARTITIONS WHERE TABLE_NAME = 'test_tbl3' ORDER BY PARTITION_ORDINAL_POSITION;查询结果中可以看到预创建出的 3 个日分区。