TTL 做什么
TTL 在 MergeTree 表上定义数据的生命周期:到期可以删除、移动到冷磁盘或冷卷,也可以只对某些列换成更高压缩率的编码。清理动作在后台合并时执行,因此不保证到点即删;它把「数据保留多久、老数据放哪里」写进表定义,减少人工清理。
基本信息
| 语法 | TTL expr [DELETE | TO DISK '…' | TO VOLUME '…' | RECOMPRESS CODEC(...)] [WHERE …] |
|---|---|
| 常用写法 | TTL event_time + INTERVAL 30 DAY DELETE、TTL event_time + INTERVAL 90 DAY TO VOLUME 'cold' |
| 触发方式 | TTL 在后台合并时评估,ALTER TABLE … MATERIALIZE TTL 可强制重算 |
| 表达式要求 | TTL 表达式的结果必须是日期时间类型 |
| 存储分层 | TO VOLUME 与 TO DISK 需要提前在存储配置里定义卷与磁盘 |
典型使用场景
- 日志与指标表按保留期自动清理
- 冷热分层:老数据自动搬到更便宜的存储卷
- 列级 TTL:给历史数据换用压缩率更高的编码
- 降低人工清理成本,替代定期执行的删除脚本
- 与分区管理配合:长期规则用 TTL,整段历史用 DROP PARTITION
定义与验证
定义与验证
CREATE TABLE logs
(
ts DateTime,
msg String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(ts)
ORDER BY ts
TTL ts + INTERVAL 30 DAY DELETE, -- 30 天前的数据删除
ts + INTERVAL 90 DAY TO VOLUME 'cold'; -- 90 天前移到冷卷
-- 修改 TTL 后强制重算,让已有 part 按新规则处理
ALTER TABLE logs MATERIALIZE TTL;
-- 查看各分区落在哪块磁盘,确认数据是否已搬走
SELECT partition, disk_name, formatReadableSize(bytes_on_disk) AS size
FROM system.parts
WHERE table = 'logs' AND active
ORDER BY partition;TTL 动作对照
| 动作 | 作用 | 注意 |
|---|---|---|
| DELETE | 到期删除数据 | 依赖合并节奏,不保证准点 |
| TO VOLUME / TO DISK | 把数据移到指定卷或磁盘 | 需要预先配置存储与卷 |
| RECOMPRESS CODEC | 到期后换用指定压缩编码 | 适合历史数据降本 |
| MATERIALIZE TTL | 强制重算并移动已有数据 | 会触发大量写操作,注意资源 |
| WHERE 条件 | 只对满足条件的数据生效 | 写错条件会让部分数据永不淘汰 |
TTL 删除依赖后台合并的节奏,短保留期的数据可能超出预期时间仍留在磁盘上;只按理论保留期做容量规划会误判可用空间,监控要看 system.parts 的实际占用。
TTL 表达式的结果必须是日期时间类型;做存储分层时,TO VOLUME 与 TO DISK 引用的卷名、磁盘名要提前在存储配置中定义好,否则建表阶段就会失败。