一、操作场景
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 的分区表),对非子分区表使用会报错。
更多手动归档操作请参见 手动归档冷数据。
十一、相关文档
·手动归档冷数据
·常见问题 > 冷数据归档
·自研内核 > 功能类特性 > 冷数据归档