帮你快速理解、总结文档立即下载
文档中心>TDSQL Boundless>操作指南>冷数据归档>基于规则归档时间分区数据

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

最近更新时间:2026-08-21 10:36:00
我的收藏

操作场景

对于按时间 RANGE / RANGE COLUMNS 分区的表,随着时间推移会产生大量历史冷数据分区。手动逐个执行 ALTER TABLE ... MODIFY PARTITION ... STORAGE_TIER 转冷运维负担重且容易遗漏。
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 ...
-- 绑定落冷DP
ALTER TABLE orders USING DISTRIBUTION POLICY auto_cooldown_6m;

-- 示例 2:创建分区表时绑定DP
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
) 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_tier
FROM information_schema.META_CLUSTER_DATA_OBJECTS
WHERE 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 的分区表),对非子分区表使用会报错。
更多手动归档操作请参见 手动归档冷数据

相关文档