联系我们
18591797788
hubin@rlctech.com
北京市海淀区中关村南大街乙12号院天作国际B座1708室
18681942657
lvyuan@rlctech.com
上海市浦东新区商城路660号乐凯大厦26c-1
18049488781
xieyi@rlctech.com
广州市越秀区东风东路华宫大厦808号1608房
029-81109312
service@rlctech.com
西安市高新区天谷七路996号西安国家数字出版基地C座501
在 OceanBase 数据库日常运维中,Range分区表的维护一直是高频痛点:手动新增分区耗时费力、易遗漏,历史分区清理不及时占用资源,批量操作还容易踩坑,尤其业务数据持续增长时,分区管理压力剧增。
ODC推出的Range分区扩展计划,完美解决这些难题,支持按策略自动创建、清理分区,无需手动干预,OB Cloud也能通用,大幅简化分区运维流程。
分区计划是专门针对 Range 分区的扩展功能,ODC 支持依据用户设置的分区策略对 Range 分区表进行自动管理,用户无需手动创建新分区,以方便维护 Range 分区表。
tips:OB Cloud也可以使用该功能

仅支持 OceanBase MySQL 和 OceanBase Oracle 数据源。
仅支持 Range 分区表。
Range 分区表中的最后一个分区上限值为 MAXVALUE 时,数据库不允许新增分区,因此不支持通过 ODC 分区计划任务创建分区策略。
分区计划默认每小时的 00 分 00 秒执行。
数据库已存在一个分区计划时,新创建的分区计划审批通过后覆盖原有分区计划。
表如果属于表组(tablegroup),创建分区可能会失败或破坏负载均衡,请谨慎配置创建策略。
新建分区可能会导致表组(tablegroup)失效,因为同属于一个表组的表必须拥有完全一致的分区,而新建分区可能会破坏这种现状,导致表组失效。
表如果包含全局索引,删除分区会导致全局索引失效,请谨慎操作;如果选择重建全局索引可能因耗时较久导致业务问题,或者重建全局索引失败导致线上问题。
重建全局索引选项仅对 Oracle 模式有效,MySQL 模式下无此选项,因 MySQL 模式下默认会重建全局索引。
表按照指定的时间间隔和数据范围将数据划分到对应的分区。创建分区策略方式包括顺序递增和自定义。
我们可以在ODC配置中点击 分区创建策略 ,来查看官方文档说明。

注意:
表如果属于表组(tablegroup),创建分区可能会失败或破坏负载均衡,请谨慎配置创建策略。
新建索引可能会导致表组(tablegroup)失效,因为同属于一个表组的表必须拥有完全一致的分区,而新建分区可能会破坏这种现状,导致表组失效。
仅适用于时间字段类型,时间字段创建的时候系统默认选择顺序递增的创建方式,可以更改为自定义的创建方式。

在【细则】中的【起始】 ,可以设置以起始时间为【当前时间】或者【指定时间】。
下图展示起始时间为【指定时间】的界面:

注意:
在【细则】中的【间隔】栏目里,Mysql模式和Oracle模式有一点区别。Mysql模式只支持日月年,而Oracle模式可以支持秒分时日月年时间间隔。


所有字段类型支持通过自定义 SQL 表达式创建分区策略。

查找SQL表达式
根据分区键的字段格式和业务创建分区的逻辑,到官网查看对应的SQL表达式填入即可。
示例: 当前一个mysql模式下有分区表order
CREATE TABLE `day_order` (`time` date NOT NULL, `parti_key` int(11), `name` varchar(120) DEFAULT NULL) partition by range columns(time, parti_key)(partition p250630 values less than ('2025-06-30', 20250630),partition p250701 values less than ('2026-07-01', 20250701));
根据定义可以分析出,parti_key的日期格式为 yyyymmdd
假设业务需求为:每月要新建一个分区
根据这两个信息进入官网查看,详情见 分区创建策略
在官方文档中找到 分区创建策略 - 自定义分区创建策略 - 分区上界生成表达式速查表-MySQL模式

找到表格后,对照信息选择表达式即可。
根据此示例信息,找到对应的SQL表达式:

根据设置的分区保留数量保留最新的分区并删除多余的分区。
需注意:
表如果包含全局索引,删除分区会导致全局索引失效,请谨慎操作;如果选择重建全局索引可能因耗时较久导致业务问题,或者重建全局索引失败导致线上问题。
重建全局索引选项仅对 Oracle 模式有效,MySQL 模式下无此选项,因 MySQL 模式下默认会重建全局索引。
分区删除策略需要考虑预创建分区的影响,避免因为分区预创建而导致的历史分区误删。例如:目标表按月分区,想保留过去 12 个月的分区,分区保留数目 中输入 12,假设此时创建策略预创建 3 个月的分区,那么实际将保留过去 9 个月和未来 3 个月的分区。
分区删除策略是针对已经存在的分区,目前仅支持一种策略:保留最近的 N 个分区,即删除最近 N 个分区外的其它分区。
在删除分区设置区域可以设置是否重建索引,如下图:

可以通过不同的策略生成分区名,分区名的生成和分区的内容相关联。目前有前缀加后缀和自定义两种分区名生成策略
前缀是一个字符串常量,后缀是针对日期型分区表达式的引用,用户可以通过修改前缀和后缀的内容,基准时间以及输出格式来获取不同的分区名。
该策略仅对日期型的分区键有效。后缀引用指定分区键对应的 SQL 表达式的值,由于限定了引用的分区键是时间类型,因此其对应的 SQL 表达式可以被转换成时间,最后再格式化输出为分区名的后缀部分。

该策略通过 SQL 表达式生成符合用户要求的分区名。在命名表达式中可以通过 ${分区键} 的方式引用分区键对应分区表达式的值。

我们可以在官方文档中找到对应的SQL表达式,详情见 分区创建策略 ,点击目录 分区创建策略 下的 分区名生成策略 - 分区名生成表达式速查表-MySQL 模式
根据业务需求,设置创建分区策略和删除分区策略的执行时间。有默认模式和自定义模式两种模式。

先选定 每天/每月/每日 ,再选定具体时间 示例:

更加灵活的设置方式。
Tips:不知道该如何填写?
将鼠标移至想要填写的维度会显示可填写的字符

示例:

示例:在数据源 obmysql 下数据库 hjx 中,每天对 day_order 表设置创建分区策略和删除分区策略。
建表语句
CREATE TABLE `order` (`time` date NOT NULL, `parti_key` int(11), `name` varchar(120) DEFAULT NULL) partition by range columns(time, parti_key)(partition p250630 values less than ('2025-06-30', 20250630),partition p250701 values less than ('2026-07-01', 20250701));
此时分区为
select PARTITION_NAME from dba_tab_partitions where table_name='order';
MySQL [oceanbase]> select PARTITION_NAME from dba_tab_partitions where table_name='order';+----------------+| PARTITION_NAME |+----------------+| p20250630 || p20250701 |+----------------+
开始验证:
1.点击新建工单-分区计划,填写数据源并选择表。


2.点击上图中的设置分区策略,勾选 创建策略 和 删除策略。

a. 创建策略中输入 预创建分区数量 、创建规则 、命名方式
b. 删除策略中输入 分区保留数量 和 是否重建索引

c. 分区配置配置完成后可以点击预览SQL检查是否正确

填写策略的执行周期,即触发时机(此处为了快速验证结果,没有按照业务逻辑来设置)
配置 任务设置


等待触发时间,查看分区。
select PARTITION_NAME from dba_tab_partitions where table_name='order';MySQL [oceanbase]> select PARTITION_NAME from dba_tab_partitions where table_name='order';+----------------+| PARTITION_NAME |+----------------+| p20250701 || p20250702 |+----------------+2 rows in set (0.02 sec)
示例:在数据源 oboracle 下数据库 hjx 中,对月 order 表设置创建分区策略和删除分区策略。
建表语句
CREATE TABLE "order" ("TIME" DATE NOT NULL ENABLE,"KEY" NUMBER(*,0) NOT NULL ENABLE,"NAME" VARCHAR2(120) DEFAULT NULL) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0partition by range("TIME", "KEY")(partition "p2025_05" values less than (TO_DATE(' 2025-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'),20250501),partition "p2025_06" values less than (TO_DATE(' 2025-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'),20250601));
此时的分区
select distinct partition_name,table_name,database_name from dba_ob_table_locations where database_name='HJX' and table_name='order';
obclient(SYS@oboracle)[SYS]> select distinct partition_name,table_name,database_name from dba_ob_table_locations where database_name='HJX' and table_name='order';+----------------+------------+---------------+| PARTITION_NAME | TABLE_NAME | DATABASE_NAME |+----------------+------------+---------------+| p2025_06 | order | HJX || p2025_05 | order | HJX |+----------------+------------+---------------+2 rows in set (0.309 sec)
创建工单
选择基本信息

此处的截图不是我第一次做,order表已经有一个分区计划了,再次对其创建会提示,若审批通过则覆盖旧的计划



结果验证
select distinct partition_name,table_name,database_name from dba_ob_table_locations where database_name='HJX' and table_name='order';obclient(SYS@oboracle)[SYS]> select distinct partition_name,table_name,database_name from dba_ob_table_locations where database_name='HJX' and table_name='order';+----------------+------------+---------------+| PARTITION_NAME | TABLE_NAME | DATABASE_NAME |+----------------+------------+---------------+| p2025_06 | order | HJX || p2025_07 | order | HJX |+----------------+------------+---------------+2 rows in set (0.188 sec)
ODC分区计划彻底解决了Range分区表手动运维的痛点,实现自动创建、智能清理、规范命名,大幅降低运维成本与失误风险,是OceanBase数据库运维的必备神器。
后续将持续分享更多OceanBase运维干货,记得关注不迷路,轻松搞定数据库运维,下次见~