TDSQL Boundless 基于规则归档时间分区数据

对于按时间 RANGE / RANGE COLUMNS 分区的表,随着时间推移会产生大量历史冷数据分区。手动逐个执行 ALTER TABLE … MODIFY PARTITION … STORAGE_TIER 转冷运维负担重且容易遗漏。

相关产品
TDSQL Boundless 产品页,含版本规格、价格与购买入口。

一、操作场景

TDSQL Boundless 支持基于 Distribution Policy(DP)的分区级自动落冷:用户在 DP 中声明过期时间窗口(EXPIRE)、落冷目标层级(STORAGE_TIER)以及分区键到时间的转换表达式,DP 绑定到分区表后,系统自动巡检过期分区并批量异步迁移至对象存储,无需人工干预。

这篇说说自动归档冷数据的完整操作流程。手动归档操作请参见 手动归档冷数据,功能架构与原理请参见 冷数据归档。

二、前提条件

·已开启冷数据归档功能,开启方式请参见 开启冷数据归档。

·集群已启用分层存储且对象存储层已配置(object_storage 可用)。

·目标表已按 RANGE 或 RANGE COLUMNS 分区,且分区键可转换为时间类型。

三、使用限制

·仅支持 RANGE / RANGE COLUMNS 分区方式,不支持 HASH / KEY / LIST 等其他分区方式。

·仅支持落冷到 OBJECT_STORAGE,暂不支持自动落冷到其他存储层。

·STORAGE_TIER 约束要求与分区过期规则(EXPIRE + PARTITION_METHOD)共存,否则 DP 创建时拒绝。

·STORAGE_TIER 指定的目标 tier 必须在集群上已启用,否则 DP 创建时拒绝。

·SQL 表达式需含 BOUND 占位符,否则 DP 创建时拒绝。

·当前仅支持热转冷(将数据从热介质迁移到冷介质),已落冷的分区不会因修改 EXPIRE 窗口而自动转热。

·落冷周期复用系统巡检间隔,不单独配置。

四、操作步骤

自动归档冷数据的完整流程如下:

1. 通过 SQL 创建含 EXPIRE + STORAGE_TIER + PARTITION_KEY_TO_TIME_TYPE 约束的 DP。

2. 创建 RANGE / RANGE COLUMNS 分区表。

3. 在建表时 USING DISTRIBUTION POLICY 绑定 DP 或建表后通过 ALTER TABLE … USING DISTRIBUTION POLICY 将 DP 绑定到分区表。

4. 等待系统巡检周期,自动检测过期分区并落冷。

5. 查看归档结果。

五、步骤1:创建含自动落冷约束的 DP

通过 CREATE DISTRIBUTION POLICY 语句创建 DP,声明分区过期规则和落冷目标:

CREATE DISTRIBUTION POLICY "auto_cooldown_6m" SET PARTITION_METHOD = "RANGE" AND PARTITION_KEY_TO_TIME_TYPE = ("sql:STR_TO_DATE(CONCAT(BOUND,'01'),'%Y%m%d')") AND EXPIRE = "6 MONTH" AND STORAGE_TIER = "OBJECT_STORAGE";

约束参数说明:

参数 说明 示例值
PARTITION_METHOD 分区方法,支持 RANGE / RANGE COLUMNS RANGE
PARTITION_KEY_TO_TIME_TYPE 分区键值到时间的转换方式。sql: 前缀表示 SQL 表达式,含 BOUND 占位符 sql:STR_TO_DATE(CONCAT(BOUND,"01"),"%Y%m%d")
EXPIRE 过期时间窗口,分区数据时间超过该窗口即判定过期 6 MONTH
STORAGE_TIER 落冷目标层级,当前仅支持 OBJECT_STORAGE OBJECT_STORAGE

可选约束 START_TIME / END_TIME 可限制过期判定的时间范围(格式 YYYY-MM-DD hh:mm:ss)。

六、步骤2:创建分区表并绑定 DP

创建按时间 RANGE 分区的表,分区键为 yyyymm(INT 类型,如 202007),并绑定 DP,有两种方式来实现这一过程:

— 示例 1(推荐):创建分区表CREATE TABLE orders ( id BIGINT NOT NULL AUTO_INCREMENT, yyyymm INT NOT NULL, data VARCHAR(255), PRIMARY KEY (id, yyyymm)) PARTITION BY RANGE (yyyymm) ( PARTITION p202006 VALUES LESS THAN (202007), PARTITION p202106 VALUES LESS THAN (202107), PARTITION p209906 VALUES LESS THAN (209907), PARTITION p299912 VALUES LESS THAN MAXVALUE);– 导入全量数据INSERT INTO orders …– 绑定落冷DPALTER TABLE orders USING DISTRIBUTION POLICY auto_cooldown_6m;– 示例 2:创建分区表时绑定DPCREATE TABLE orders ( id BIGINT NOT NULL AUTO_INCREMENT, yyyymm INT NOT NULL, data VARCHAR(255), PRIMARY KEY (id, yyyymm)) PARTITION BY RANGE (yyyymm) ( PARTITION p202006 VALUES LESS THAN (202007), PARTITION p202106 VALUES LESS THAN (202107), PARTITION p209906 VALUES LESS THAN (209907), PARTITION p299912 VALUES LESS THAN MAXVALUE) USING DISTRIBUTION POLICY auto_cooldown_6m;

绑定后即自动生效,无需额外操作。系统会在下一个巡检周期开始检测过期分区。

推荐使用示例 1 中所述的过程,因为示例 2 会在巡检中提前将分区 p202006、p202106 转冷,转冷后的分区存在较大的性能回退,不利于后期的数据导入,因此建议先将数据导入(或尽可能多的将数据导入)后再绑定落冷 DP。

七、步骤3:自动落冷生效

绑定 DP 后,系统按巡检周期自动执行以下闭环:

1. 判定过期:取分区 bound 值(如 202007),通过转换表达式计算为时间(如 2020-07-01),结合 EXPIRE 约束(如 6 MONTH)判断分区是否过期。

2. 聚合落冷:过期分区按表聚合,批量下发 ALTER TABLE … MODIFY PARTITION (…) STORAGE_TIER = OBJECT_STORAGE,将分区数据迁移到对象存储。

3. 缓存加速:过期时间计算结果缓存,DP 变更时自动失效,避免每轮巡检重复计算。

以 EXPIRE = 6 MONTH 为例:

分区 落冷行为
p202006 / p202106(远过去) 自动落冷到 OBJECT_STORAGE
p209906 / p299912(远未来) 保持原 tier

注意:说明:

注意:落冷周期与系统巡检间隔一致,绑定 DP 后需等待一个完整巡检周期后方可观察落冷效果。

八、步骤4:查看归档结果

通过 SHOW CREATE TABLE 确认分区 storage tier 变为 OBJECT_STORAGE:

SHOW CREATE TABLE orders;

通过 information_schema.META_CLUSTER_DATA_OBJECTS 确认分区对象 storage tier:

SELECT table_name, partition_name, storage_tierFROM information_schema.META_CLUSTER_DATA_OBJECTSWHERE table_name = 'orders'ORDER BY partition_name;

更多查看方式(控制台归档列表、转冷任务进度、冷热数据用量分布)请参见 手动归档冷数据 > 查看归档结果。

九、sql: 表达式语法详解

PARTITION_KEY_TO_TIME_TYPE 约束支持 sql: 前缀表达式语法,用户可在约束值中声明任意 SQL 表达式,通过 BOUND 占位符引用分区 bound 值,运行时由系统计算为 DATETIME。

BOUND 占位符:表达式中必须包含 BOUND 标识符,运行时替换为分区的实际 bound 值。例如分区 p202006 VALUES LESS THAN (202007) 的 BOUND 值为 202007。

常见分区键格式的转换表达式:

分区键格式 转换表达式 说明
yyyymm(INT,如 202007) sql:STR_TO_DATE(CONCAT(BOUND,'01'),'%Y%m%d') 补全为 20200701 后转为日期
yyyy-mm-dd(VARCHAR) sql:STR_TO_DATE(BOUND,'%Y-%m-%d') 直接解析日期字符串
Unix 时间戳(INT) sql:FROM_UNIXTIME(BOUND) 时间戳转 DATETIME

注意:1. SQL 表达式需含 BOUND 占位符,否则 DP 创建时拒绝。

注意:2. 表达式中不允许包含分号、SQL 注释、DML/DDL 关键词,否则 DP 创建时拒绝。

注意:3. 表达式在 DP 创建时用测试值校验语法;绑定到表(含建表绑定和 ALTER 绑定)时,用全部非 MAXVALUE 分区的真实 bound 值逐个校验兼容性,任一分区校验失败(表达式执行报错或计算结果为 NULL)则拒绝绑定。

十、手动修改分区存储层级

除自动落冷外,用户也可手动修改分区或子分区的存储层级:

— 修改一级分区的 storage tier(子分区表会下钻到所有子分区)ALTER TABLE t MODIFY PARTITION (p0, p1) STORAGE_TIER = object_storage;– 修改子分区的 storage tier(仅指定子分区)ALTER TABLE t MODIFY SUBPARTITION (sp0a, sp1b) STORAGE_TIER = object_storage;

MODIFY SUBPARTITION 仅适用于子分区表(即使用了 SUBPARTITION BY 的分区表),对非子分区表使用会报错。

更多手动归档操作请参见 手动归档冷数据。

十一、相关文档

·手动归档冷数据

·常见问题 > 冷数据归档

·自研内核 > 功能类特性 > 冷数据归档

赞 (0)
上一篇 4天前
下一篇 4天前