×
技术社区 >  技术博客 >  告别手动分区!ODC Range分区自动管理,OB运维效率翻倍

告别手动分区!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 = 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)
  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运维干货,记得关注不迷路,轻松搞定数据库运维,下次见~

精选推荐