文档

分区管理

更新时间:

本文档旨在介绍如何在 ODC 上使用分区计划,包括对新建和删除的表分区进行自动管理。

背景信息

  • Range 分区:Range 分区是最常见的分区类型,通常与日期一起使用。在进行 Range 分区时,数据库根据分区键的值范围将行映射到分区。详情请参见 设置分区规则分区类型

  • 分区计划:在 Range 分区表中插入数据时,如果插入的数据超出当前分区的区间上限值,将无法插入数据并且会返回错误。分区计划是专门针对 Range 分区的扩展功能,ODC 支持依据用户设置的分区策略对 Range 分区表进行自动管理,用户无需手动创建新分区,以方便维护 Range 分区表。

  • 创建策略:表按照指定的时间间隔和数据范围将数据划分到对应的分区。创建分区策略方式包括顺序递增和自定义。

    • 顺序递增:创建分区策略方式,仅适用于时间字段类型。

      image

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

      image

  • 删除策略:根据设置的分区保留数量保留最新的分区并删除多余的分区。

原理介绍

image

  1. 对表设置创建分区策略/删除分区策略。

  2. 指定策略执行周期。

  3. 执行分区计划。

注意事项

  • 仅支持 OceanBase MySQL 和 OceanBase Oracle 数据源。

  • 仅支持 Range 分区表。

  • Range 分区表中的最后一个分区上限值为 MAXVALUE 时,数据库不允许新增分区,因此不支持通过 ODC 分区计划任务创建分区策略。

  • 分区计划默认每小时的 00 分 00 秒执行。

  • 数据库已存在一个分区计划时,新创建的分区计划审批通过后覆盖原有分区计划。

  • 表如果属于表组(tablegroup),创建分区可能会失败或破坏负载均衡,请谨慎配置创建策略。

  • 新建索引可能会导致表组(tablegroup)失效,因为同属于一个表组的表必须拥有完全一致的分区,而新建分区可能会破坏这种现状,导致表组失效。

  • 表如果包含全局索引,删除分区会导致全局索引失效,请谨慎操作;如果选择重建全局索引可能因耗时较久导致业务问题,或者重建全局索引失败导致线上问题。

  • 重建全局索引选项仅对 Oracle 模式有效,MySQL 模式下无此选项,因 MySQL 模式下默认会重建全局索引。

新建分区计划

示例:在数据源 mysql424 下数据库 test_424 中,每隔 1 个月预创建 1 个 order 表分区。

信息项

示例值

项目名称

odc_4.2.0

所属数据源

mysql424

数据库名称

test_424

表名称

order

  1. 在 SQL 窗口中,编辑 SQL 语句以创建表 order。

    image

    CREATE TABLE `order` (
    `time` date NOT NULL,
     `parti_key` int(11),
     `name` varchar(120) DEFAULT NULL
    ) partition by range columns(time, parti_key)
    (partition p2023_01 values less than ('2023-01-01', 20230101),
    partition p2023_02 values less than ('2023-02-01', 20230201))
  2. 在 SQL 开发窗口的 工单 页签中单击 分区计划 > 新建分区计划

    image

  3. 新建分区计划 面板中指定以下信息。

    image

    信息项

    说明

    数据库

    选择创建分区计划所属数据库。

    分区策略

    勾选所属库中的 Range 分区表,并单击image编辑对应的分区策略。具体配置请参见本篇文档中的设置分区策略

    说明
    • 勾选 分区策略 右侧的 仅显示未设置的表 时,支持过滤未设置的表。

    • 勾选 Range 分区表时,支持批量设置分区策略。

    设置策略执行周期

    1. 创建策略执行周期:设置所有的分区创建策略的执行时机,例如每晚 2 点执行。

    2. 删除策略执行周期:勾选自定义删除策略执行周期,设置所有的分区删除策略的执行时机,如果勾选,分区删除策略将会和分区新建策略一起被调度执行。

    示例:创建策略执行周期每晚 3 点,删除策略执行周期每晚 1 点。表示每晚 3 点将会运行该数据库下所有的分区创建策略,每晚 1 点将会运行该数据库下所有的分区删除策略。

    image

    任务设置

    选择任务错误处理方式:

    • 停止任务:停止任务为默认方式,运行脚本的过程中出现错误时会停止运行。

    • 忽略错误继续任务:选择忽略错误继续任务方式,在运行脚本出现错后将跳过错误语句继续执行。

    执行超时时间

    默认 2 小时。

    备注

    描述项目的业务背景信息,例如变更目的、预期目标等。

  4. 指定上述信息后,单击面板右下角的 提交 按钮完成创建分区计划任务。

  5. 任务生成后会自动弹出 任务中心 面板,在任务中心可以查看任务审批状态和任务信息。

    image

设置分区策略

分区创建策略

重要
  • 表如果属于表组(tablegroup),创建分区可能会失败或破坏负载均衡,请谨慎配置创建策略。

  • 新建索引可能会导致表组(tablegroup)失效,因为同属于一个表组的表必须拥有完全一致的分区,而新建分区可能会破坏这种现状,导致表组失效。

自定义分区创建策略

自定义分区创建策略是通过 SQL 表达式来生成分区的上界,分为以下 3 个步骤:

  1. 通过 SQL 表达式获取基准时间:基准时间是指分区生成时所依赖的起始时间。

    • 以分区计划运行的时间为起始时间:直接使用now()或者sysdate

    • 以目标表当前最后一个分区对应位置的上界内容作为基准时间:使用${LAST_PARTITION_VALUE}引用最后一个分区对应位置的上界内容。如果最后一个分区对应位置的上界内容为非时间类型,您需要通过若干 SQL 函数将其转化为时间类型。

  2. 定义分区生成的间隔:分区计划将会以此间隔作为分区生成的时间步长以生成若干个分区。您在 间隔 输入框中输入所需间隔后,ODC 通过${INTERVAL}表达式引用该间隔,并且将该间隔加入到步骤 1 所生成的 SQL 表达式中。

  3. 生成对应分区键类型的分区表达式:将步骤 1 和步骤 2 生成的时间类型的 SQL 表达式转换成对应分区键真实的类型(如果对应分区键的类型与 SQL 表达式的类型相同,可忽略此步骤)。

自定义分区创建策略中支持变量引用,目前支持的表达式如下:

表达式名

说明

示例

INTERVAL

时间间隔,用以描述分区生成时的步长。ODC 在运行时会将该变量引用替换为 创建规则 > 细则 > 间隔 中的内容。

${INTERVAL}

LAST_PARTITION_VALUE

当前表最后一个已存在分区的对应位置的分区上界内容。ODC 在运行时将会把该变量并替换为目标表当前最后一个分区对应位置上表达式的值。

例如:当前最后一个分区为partition p1 values less then('2024-03-18'),则该变量引用的值为'2024-03-18'

${LAST_PARTITION_VALUE}

通常情况下,如果您采用自定义方式创建分区策略表示需要将非时间类型分区键按照时间类型的方式递增生成新的分区。下表可以帮助您快速写出正确的 SQL 表达式:

分区上界生成表达式速查表
重要
  • 分区生成过程中支持 2 种基准时间:当前时间为基准时间或者目标表当前最后一个分区对应位置的分区上界的内容为基准时间。

  • 如果选择目标表当前最后一个分区对应位置的分区上界的内容为分区生成的基准时间,表示分区计划每运行一次就会生成一批新的分区,这可能会导致分区过多,请谨慎配置。

  • MySQL 模式

    分区键类型

    分区表达式样例

    说明

    间隔

    分区上界计算 SQL 表达式

    当前时间为基准时间

    目标表当前最后一个分区对应位置分区上界表达式的内容为基准时间

    字符串类型

    partition p0 values less than ('2024')

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '''%Y''')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '-01-01'), '%Y-%m-%d') + interval ${INTERVAL} year, '''%Y''')

    partition p0 values less than ('202401')

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '''%Y01''')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '01'), '%Y%m%d') + interval ${INTERVAL} year, '''%Y%m''')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '''%Y%m''')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '01'), '%Y%m%d') + interval ${INTERVAL} month, '''%Y%m''')

    partition p0 values less than ('2024-01')

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '''%Y-01''')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '-01'), '%Y-%m-%d') + interval ${INTERVAL} year, '''%Y-%m''')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '''%Y-%m''')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '-01'), '%Y-%m-%d') + interval ${INTERVAL} month, '''%Y-%m''')

    partition p0 values less than ('2024/01')

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '''%Y/01''')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '/01'), '%Y/%m/%d') + interval ${INTERVAL} year, '''%Y/%m''')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '''%Y/%m''')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '/01'), '%Y/%m/%d') + interval ${INTERVAL} month, '''%Y/%m''')

    partition p0 values less than ('20240101')

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '''%Y0101''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y%m%d') + interval ${INTERVAL} year, '''%Y%m%d''')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '''%Y%m01''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y%m%d') + interval ${INTERVAL} month, '''%Y%m%d''')

    按日生成

    1

    date_format(now() + interval ${INTERVAL} day, '''%Y%m%d''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y%m%d') + interval ${INTERVAL} day, '''%Y%m%d''')

    partition p0 values less than ('2024-01-01')

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '''%Y-01-01''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y-%m-%d') + interval ${INTERVAL} year, '''%Y-%m-%d''')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '''%Y-%m-01''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y-%m-%d') + interval ${INTERVAL} month, '''%Y-%m-%d''')

    按日生成

    1

    date_format(now() + interval ${INTERVAL} day, '''%Y-%m-%d''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y-%m-%d') + interval ${INTERVAL} day, '''%Y-%m-%d''')

    partition p0 values less than ('2024/01/01')

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '''%Y/01/01''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y/%m/%d') + interval ${INTERVAL} year, '''%Y/%m/%d''')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '''%Y/%m/01''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y/%m/%d') + interval ${INTERVAL} month, '''%Y/%m/%d''')

    按日生成

    1

    date_format(now() + interval ${INTERVAL} day, '''%Y/%m/%d''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y/%m/%d') + interval ${INTERVAL} day, '''%Y/%m/%d''')

    partition p0 values less than ('2024-01-01 00:00:00')

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '''%Y-01-01 00:00:00''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y-%m-%d %H:%i:%s') + interval ${INTERVAL} year, '''%Y-%m-%d %H:%i:%s''')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '''%Y-%m-01 00:00:00''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y-%m-%d %H:%i:%s') + interval ${INTERVAL} month, '''%Y-%m-%d %H:%i:%s''')

    按日生成

    1

    date_format(now() + interval ${INTERVAL} day, '''%Y-%m-%d 00:00:00''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y-%m-%d %H:%i:%s') + interval ${INTERVAL} day, '''%Y-%m-%d %H:%i:%s''')

    partition p0 values less than ('2024/01/01 00:00:00')

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '''%Y/01/01 00:00:00''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y/%m/%d %H:%i:%s') + interval ${INTERVAL} year, '''%Y/%m/%d %H:%i:%s''')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '''%Y/%m/01 00:00:00''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y/%m/%d %H:%i:%s') + interval ${INTERVAL} month, '''%Y/%m/%d %H:%i:%s''')

    按日生成

    1

    date_format(now() + interval ${INTERVAL} day, '''%Y/%m/%d 00:00:00''')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y/%m/%d %H:%i:%s') + interval ${INTERVAL} day, '''%Y/%m/%d %H:%i:%s''')

    数字类型

    partition p0 values less than (2024)

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '%Y')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '-01-01'), '%Y-%m-%d') + interval ${INTERVAL} year, '%Y')

    partition p0 values less than (202401)

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '%Y01')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '01'), '%Y%m%d') + interval ${INTERVAL} year, '%Y%m')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '%Y%m')

    date_format(str_to_date(concat(${LAST_PARTITION_VALUE}, '01'), '%Y%m%d') + interval ${INTERVAL} month, '%Y%m')

    partition p0 values less than (20240101)

    按年生成

    1

    date_format(now() + interval ${INTERVAL} year, '%Y0101')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y%m%d') + interval ${INTERVAL} year, '%Y%m%d')

    按月生成

    1

    date_format(now() + interval ${INTERVAL} month, '%Y%m01')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y%m%d') + interval ${INTERVAL} month, '%Y%m%d')

    按日生成

    1

    date_format(now() + interval ${INTERVAL} day, '%Y%m%d')

    date_format(str_to_date(${LAST_PARTITION_VALUE}, '%Y%m%d') + interval ${INTERVAL} day, '%Y%m%d')

    partition p0 values less than (1709222400)

    注:Unix 时间戳

    按年生成

    1

    unix_timestamp(str_to_date(date_format(now() + interval ${INTERVAL} year, '%Y-01-01 00:00:00'), '%Y-%m-%d %H:%i:%s'))

    unix_timestamp(str_to_date(date_format(from_unixtime(${LAST_PARTITION_VALUE}) + interval ${INTERVAL} year, '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d %H:%i:%s'))

    按月生成

    1

    unix_timestamp(str_to_date(date_format(now() + interval ${INTERVAL} month, '%Y-%m-01 00:00:00'), '%Y-%m-%d %H:%i:%s'))

    unix_timestamp(str_to_date(date_format(from_unixtime(${LAST_PARTITION_VALUE}) + interval ${INTERVAL} month, '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d %H:%i:%s'))

    按日生成

    1

    unix_timestamp(str_to_date(date_format(now() + interval ${INTERVAL} day, '%Y-%m-%d 00:00:00'), '%Y-%m-%d %H:%i:%s'))

    unix_timestamp(str_to_date(date_format(from_unixtime(${LAST_PARTITION_VALUE}) + interval ${INTERVAL} day, '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d %H:%i:%s'))

Oracle 模式

分区键类型

分区表达式样例

说明

间隔

分区上界计算 SQL 表达式

当前时间为基准时间

目标表当前最后一个分区对应位置分区上界表达式的内容为基准时间

字符串类型

partition p0 values less than ('2024')

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY''')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '-01-01'), 'YYYY-MM-DD') + ${INTERVAL}, '''YYYY''')

partition p0 values less than ('202401')

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY"01"''')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '01'), 'YYYYMMDD') + ${INTERVAL}, '''YYYYMM''')

按年生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYYMM''')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '01'), 'YYYYMMDD') + ${INTERVAL}, '''YYYYMM''')

partition p0 values less than ('2024-01')

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-"01"''')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '-01'), 'YYYY-MM-DD') + ${INTERVAL}, '''YYYY-MM''')

按月生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM''')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '-01'), 'YYYY-MM-DD') + ${INTERVAL}, '''YYYY-MM''')

partition p0 values less than ('2024/01')

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/"01"''')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '/01'), 'YYYY/MM/DD') + ${INTERVAL}, '''YYYY/MM''')

按月生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM''')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '/01'), 'YYYY/MM/DD') + ${INTERVAL}, '''YYYY/MM''')

partition p0 values less than ('20240101')

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY"01""01"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYYMMDD') + ${INTERVAL}, '''YYYYMMDD''')

按月生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYYMM"01"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYYMMDD') + ${INTERVAL}, '''YYYYMMDD''')

按日生成

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYYMMDD''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYYMMDD') + ${INTERVAL}, '''YYYYMMDD''')

partition p0 values less than ('2024-01-01')

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-"01"-"01"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY-MM-DD') + ${INTERVAL}, '''YYYY-MM-DD''')

按月生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-"01"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY-MM-DD') + ${INTERVAL}, '''YYYY-MM-DD''')

按日生成

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-DD''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY-MM-DD') + ${INTERVAL}, '''YYYY-MM-DD''')

partition p0 values less than ('2024/01/01')

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/"01"/"01"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY/MM/DD') + ${INTERVAL}, '''YYYY/MM/DD''')

按月生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/"01"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY/MM/DD') + ${INTERVAL}, '''YYYY/MM/DD''')

按日生成

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/DD''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY/MM/DD') + ${INTERVAL}, '''YYYY/MM/DD''')

partition p0 values less than ('2024-01-01 00:00:00')

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-"01"-"01 00:00:00"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY-MM-DD HH24:MI:SS') + ${INTERVAL}, '''YYYY-MM-DD HH24:MI:SS''')

按月生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-"01 00:00:00"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY-MM-DD HH24:MI:SS') + ${INTERVAL}, '''YYYY-MM-DD HH24:MI:SS''')

按日生成

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-DD "00:00:00"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY-MM-DD HH24:MI:SS') + ${INTERVAL}, '''YYYY-MM-DD HH24:MI:SS''')

partition p0 values less than ('2024/01/01 00:00:00')

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/"01"/"01 00:00:00"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY/MM/DD HH24:MI:SS') + ${INTERVAL}, '''YYYY/MM/DD HH24:MI:SS''')

按月生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/"01 00:00:00"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY/MM/DD HH24:MI:SS') + ${INTERVAL}, '''YYYY/MM/DD HH24:MI:SS''')

按日生成

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/DD "00:00:00"''')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYY/MM/DD HH24:MI:SS') + ${INTERVAL}, '''YYYY/MM/DD HH24:MI:SS''')

数字类型

partition p0 values less than (2024)

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYY')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '-01-01'), 'YYYY-MM-DD') + ${INTERVAL}, 'YYYY')

partition p0 values less than (202401)

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYY"01"')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '01'), 'YYYYMMDD') + ${INTERVAL}, 'YYYYMM')

按月生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMM')

TO_CHAR(TO_DATE(CONCAT(${LAST_PARTITION_VALUE}, '01'), 'YYYYMMDD') + ${INTERVAL}, 'YYYYMM')

partition p0 values less than (20240101)

按年生成

NUMTOYMINTERVAL(1, 'YEAR')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYY"01""01"')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYYMMDD') + ${INTERVAL}, 'YYYYMMDD')

按月生成

NUMTOYMINTERVAL(1, 'MONTH')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMM"01"')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYYMMDD') + ${INTERVAL}, 'YYYYMMDD')

按日生成

NUMTODSINTERVAL(1, 'DAY')

TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMMDD')

TO_CHAR(TO_DATE(${LAST_PARTITION_VALUE}, 'YYYYMMDD') + ${INTERVAL}, 'YYYYMMDD')

顺序递增分区创建策略

  • 顺序递增只针对时间类型的分区键。

  • 顺序递增的基准时间可以当前时间和指定时间为准,按照用户配置的时间间隔顺序生成新的分区。

分区名生成策略

  • 前缀加后缀策略:该策略生成的分区名包含前缀和后缀两个部分,前缀是一个字符串常量,后缀是以时间为基础的变量,用户可以通过修改前缀和后缀的内容,基准时间以及输出格式来获取不同的分区名。

自定义策略:该策略与自定义分区生成策略原理类似,是通过 SQL 表达式生成符合用户要求的分区名。

重要

该 SQL 表达式最终的类型应该为字符型。

分区删除策略

重要
  • 表如果包含全局索引,删除分区会导致全局索引失效,请谨慎操作;如果选择重建全局索引可能因耗时较久导致业务问题,或者重建全局索引失败导致线上问题。

  • 重建全局索引选项仅对 Oracle 模式有效,MySQL 模式下无此选项,因 MySQL 模式下默认会重建全局索引。

分区删除策略是针对已经存在的分区,目前仅支持一种策略:保留最近的 N 个分区,即删除最近 N 个分区外的其它分区。

示例:

  1. 创建order表且表中包含p2023_01p2023_02两个分区。

    CREATE TABLE `order` (
    `time` date NOT NULL,
    `parti_key` int(11),
     `name` varchar(120) DEFAULT NULL
    ) partition by range columns(time, parti_key)
    (partition p2023_01 values less than ('2023-01-01', 20230101),
    partition p2023_02 values less than ('2023-02-01', 20230201))
  2. order表配置分区删除策略(保留最近 1 个分区)。

  3. 根据分区删除策略形成的分区删除语句将会删除p2023_01分区。

设置 OceanBase MySQL 类型的表分区策略

示例:在数据源 mysql424 下数据库 test_424 中,对order表设置创建分区策略和删除分区策略。

信息项

示例值

项目名称

odc_4.2.0

所属数据源

mysql424

数据库名称

test_424

表名称

order

  1. 在 SQL 窗口中,编辑 SQL 语句以创建表 order。

    image

    CREATE TABLE `order` (
    `time` date NOT NULL,
     `parti_key` int(11),
     `name` varchar(120) DEFAULT NULL
    ) partition by range columns(time, parti_key)
    (partition p2023_01 values less than ('2023-01-01', 20230101),
    partition p2023_02 values less than ('2023-02-01', 20230201))
  2. 在 SQL 开发窗口的 工单 页签中单击 分区计划 > 新建分区计划

    image

  3. 新建分区计划面板中,单击image编辑分区策略。

    image

  4. 分区策略 面板中,勾选 分区策略 项下的 创建策略,创建分区策略。

    image

  5. 设置将要创建的分区数量。

  6. 设置将要创建的分区数量。

  7. 创建规则。

    如上图所示,可以对order表中包含的timeparti_key分区键设置分区策略。

    • time:该分区键类型为DATE,属于时间类型,因此其可以使用 顺序递增 作为分区创建策略。示例中,time分区键的创建策略是以当前时间(即分区计划任务实际运行时的时间)为基准时间,间隔 1 个月生成若干分区。

    • parti_key:该分区键类型为INT,不属于时间类型,只能使用 自定义 作为分区新建策略。假定需要以当前时间为基准,间隔 1 个月生成若干分区。参照原理介绍一节中关于 自定义分区创建策略 的表述,该表达式可以按照如下步骤生成:

      1. 获取分区生成的基准时间:由于是以当前时间为基准,可以直接使用now()函数。

      2. 定义分区生成的间隔:由于示例中是以 1 个月为间隔,因此在 创建规则 > 细则 > 间隔 中填入 1 作为固定间隔,且在步骤 1 表达式的基础上增加 interval 表达式,生成下一个分区。即now () + interval ${INTERVAL} month,其中${INTERVAL}指代 创建规则 > 细则 > 间隔 中填入的值。

      3. 生成对应分区键类型的分区表达式:parti_key的类型为int,但步骤 1 中生成的表达式的类型为时间类型,需要将其转换为int类型。您可以先将其转成数字样式的字符串,再转换为int类型,即:cast(date_format(now() + interval ${INTERVAL} month, '%Y%m01') as signed)

        其中,

        • CAST(xxx AS SIGNED):将字段转换成整数。

        • DATE_FORMAT():将字段转换成日期格式。

        • NOW():返回当前日期。

        • INTERVAL ${INTERVAL} MONTH:按月间隔表达式,${INTERVAL}为 ODC 定义的时间间隔函数固定用法

        • '%Y%m01':日期格式。

  8. 选择命名方式。

    如上图所示,选择的命名方式为 前缀+后缀,该命名方式由一个固定字符串前缀和基于时间的可变后缀构成。

    1. 固定前缀:该前缀可由用户自由指定。

    2. 可变后缀:可选择时间类型的分区键对应的分区上界作为当前分区的命名后缀,另外可选时间的格式化输出格式以及时间的递增间隔。

    3. 配置完成后,单击 测试生成 按钮可以查看设置的分区名。

  9. 删除分区 项下,根据时间间隔设置预创建相应数量的分区,并选择删除后是否重建索引。

  10. 单击 分区策略 面板右下角的 预览 SQL 查看根据所设置的分区策略生成的 SQL 语句。

    image

  11. 单击 确定,完成设置分区策略。

设置 OceanBase Oracle 类型的表分区策略

示例:在数据源 oboracle_430 下数据库 OBORACLE 中,对order表设置创建分区策略和删除分区策略。

  1. 在 SQL 窗口中,编辑 SQL 语句以创建表 order。

    image

    CREATE TABLE "OBORACLE"."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 "p2024_01" values less than (TO_DATE(' 2024-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'),20240101),
    partition "p2024_02" values less than (TO_DATE(' 2024-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'),20240201));
  2. 在 SQL 开发窗口的 工单 页签中单击 分区计划 > 新建分区计划

    image

  3. 新建分区计划面板中,单击image编辑分区策略。

    image

  4. 分区策略 面板中,勾选 分区策略 项下的 创建策略,创建分区策略。

    image

  5. 设置将要创建的分区数量。

  6. 创建规则。

    如上图所示,可以对order表中包含的TIMEKEY分区键设置分区策略。

    • TIME:该分区键类型为DATE,属于时间类型,因此其可以使用 顺序递增 作为分区创建策略。示例中,TIME分区键的创建策略是以当前时间(即分区计划任务实际运行时的时间)为基准时间,间隔 1 个月生成若干分区。

    • KEY:该分区键类型为NUMBER,不属于时间类型,只能使用 自定义 作为分区新建策略。假定需要以当前系统时间为基准,间隔 1 个月生成若干分区。参照 原理介绍 一节中关于 自定义分区创建策略 的表述,该表达式可以按照如下步骤生成:

      1. 获取分区生成的基准时间:由于是以当前系统时间为基准,可以直接使用sysdate函数。

      2. 定义分区生成的间隔:由于示例中是以 1 个月为间隔,因此在 创建规则 > 细则 > 间隔 中填入NUMTOYMINTERVAL(1, 'MONTH')作为固定间隔,且在步骤 1 表达式的基础上增加 interval 表达式,生成下一个分区。即SYSDATE + ${INTERVAL},其中${INTERVAL}指代 创建规则 > 细则 > 间隔 中填入的值。

      3. 生成对应分区键类型的分区表达式:KEY的类型为NUMBER,但步骤 1 中生成的表达式的类型为时间类型,需要将其转换为NUMBER类型。您可以先将其转成数字样式的字符串,再转换为NUMBER类型,即:TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMM"01"')

        其中,

        • TO_CHAR:将字段转换成字符型。

        • SYSDATE:返回当前系统时间。

        • YYYYMM"01":日期格式。

  7. 选择命名方式。

    如上图所示,选择的命名方式为 前缀+后缀,该命名方式由一个固定字符串前缀和基于时间的可变后缀构成。

    1. 固定前缀:该前缀可由用户自由指定。

    2. 可变后缀:可选择时间类型的分区键对应的分区上界作为当前分区的命名后缀,另外可选时间的格式化输出格式以及时间的递增间隔。

    3. 配置完成后,单击 测试生成 按钮可以查看设置的分区名。

  8. 删除分区 项下,根据时间间隔设置预创建相应数量的分区,并选择删除后是否重建索引。

  9. 单击 分区策略 面板右下角的 预览 SQL 查看根据所设置的分区策略生成的 SQL 语句。

    image

  10. 单击 确定,完成设置分区策略。

查看分区计划

任务信息

  1. 工单 的分区计划列表中,单击操作列中的 查看 按钮。

    image

  2. 在弹出的 任务详情 面板中,单击 任务信息 页签查看任务基本信息和设置信息。

    信息项

    说明

    任务基本信息

    显示 任务状态任务编号任务类型、所属数据源风险等级、备注、创建人 创建时间 等信息。

    任务设置信息

    显示创建分区计划任务时所选择的 Range 分区表的分区策略信息。

  3. 在任务信息面板右下角,单击 再次发起,可以重新发起任务。

任务流程

  1. 任务详情 面板中,单击 任务流程 页签查看 发起任务状态审批状态执行状态 完成结果 等信息。

  2. 在面板右下角,单击 再次发起,可重新发起任务。

关联记录

  1. 任务详情 面板中,单击 关联记录 页签查看 任务编号所属库创建时间任务状态 查看 操作等信息。

  2. 在面板右下角,单击 再次发起,可重新发起任务。

任务日志

  1. 任务详情 面板中,单击 任务日志 标签查看任务的全部日志和告警日志。

    image

    信息项

    说明

    全部日志

    全部日志显示任务的 INFOERROR WARN 日志等全量信息。 单击 查找下载 复制 按钮,可查找信息、下载或复制全部日志信息。

    告警日志

    告警日志单独显示任务的 ERROR WARN 日志。当任务失败时,可通过告警日志查看错误信息。 单击 查找下载 复制 按钮,可查找信息、下载或复制告警日志信息。

  2. 单击 再次发起,可重新发起任务。

相关文档

  • 本页导读 (0)
文档反馈