告别手动分区!ODC Range分区自动管理,OB运维效率翻倍

在 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检查是否正确

  1. 填写策略的执行周期,即触发时机(此处为了快速验证结果,没有按照业务逻辑来设置)
  2. 配置 任务设置
  1. 提交计划后,可查看计划
  1. 等待触发时间,查看分区。

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)
  1. 创建工单
  2. 选择基本信息

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

  1. 设置 分区策略
  1. 设置 执行周期 和 任务设置
  1. 结果验证

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运维干货,记得 关注不迷路,轻松搞定数据库运维,下次见~

请使用浏览器的分享功能分享到微信等