在 OceanBase 数据库日常运维中,Range分区表的维护一直是高频痛点: 手动新增分区耗时费力、易遗漏,历史分区清理不及时占用资源,批量操作还容易踩坑,尤其业务数据持续增长时,分区管理压力剧增。
ODC推出的 Range分区扩展计划*,完美解决这些难题,支持按策略自动创建、清理分区,无需手动干预,OB Cloud也能通用,大幅简化分区运维流程。
什么是ODC分区计划?
分区计划是专门针对 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)失效,因为同属于一个表组的表必须拥有完全一致的分区,而新建分区可能会破坏这种现状,导致表组失效。
1. 顺序递增方式
仅适用于 时间字段类型,时间字段创建的时候系统默认选择顺序递增的创建方式,可以更改为自定义的创建方式。
在【细则】中的【起始】 ,可以设置以起始时间为【当前时间】或者【指定时间】。
下图展示起始时间为【指定时间】的界面:
注意:
在【细则】中的【间隔】栏目里,Mysql模式和Oracle模式有一点区别。Mysql模式只支持 日月年,而Oracle模式可以支持 秒分时日月年时间间隔。
2. 自定义方式
所有字段类型支持通过 自定义 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 个分区外的其它分区。
在删除分区设置区域可以设置是否重建索引,如下图:
(三)分区命名方式
可以通过不同的策略生成分区名,分区名的生成和分区的内容相关联。目前有 前缀加后缀和 自定义两种分区名生成策略
1. 前缀加后缀策略
前缀是一个字符串常量,后缀是针对日期型分区表达式的引用,用户可以通过修改前缀和后缀的内容,基准时间以及输出格式来获取不同的分区名。
该策略仅对日期型的分区键有效。后缀引用指定分区键对应的 SQL 表达式的值,由于限定了引用的分区键是时间类型,因此其对应的 SQL 表达式可以被转换成时间,最后再格式化输出为分区名的后缀部分。
2. 自定义策略
该策略通过 SQL 表达式生成符合用户要求的分区名。在命名表达式中可以通过 ${分区键} 的方式引用分区键对应分区表达式的值。
我们可以在官方文档中找到对应的SQL表达式,详情见 分区创建策略 ,点击目录 分区创建策略 下的 分区名生成策略 - 分区名生成表达式速查表-MySQL 模式
(四)触发时机
根据业务需求,设置创建分区策略和删除分区策略的执行时间。有 默认模式和 自定义模式两种模式。
1. 默认模式
先选定 每天/每月/每日 ,再选定具体时间 示例:
2. 自定义模式
更加灵活的设置方式。
Tips:不知道该如何填写?
将鼠标移至想要填写的维度会显示可填写的字符
示例:
验证功能
(一)Mysql兼容模式下的分区计划
示例:在数据源 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)
(二)Oracle兼容模式下的分区计划
示例:在数据源 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 = 0
partition 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运维干货,记得 关注不迷路,轻松搞定数据库运维,下次见~
