操作场景
对于按时间 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" SETPARTITION_METHOD = "RANGE" ANDPARTITION_KEY_TO_TIME_TYPE = ("sql:STR_TO_DATE(CONCAT(BOUND,'01'),'%Y%m%d')") ANDEXPIRE = "6 MONTH" ANDSTORAGE_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:SELECTtable_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 的分区表),对非子分区表使用会报错。相关文档
手动归档冷数据