首页/数据/NoSQL 速查/TTL 数据过期与冷热分层
ClickHouse56 条

TTL 数据过期与冷热分层

TTL 在 MergeTree 表上定义数据生命周期:到期可以删除、移动到冷磁盘或卷,也可以按列级 TTL 压缩;清理动作在后台合并时执行,不保证到点即删。

NoSQL 速查数据更新于 2026-10-13

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 引用的卷名、磁盘名要提前在存储配置中定义好,否则建表阶段就会失败。

易错点

  • TTL 删除依赖合并节奏,数据可能超出保留期仍留在磁盘上,容量规划不能只按理论保留期估算
  • 按分区整体管理生命周期(DROP PARTITION)比逐行 TTL 更省资源,两者可以组合:长期规则用 TTL,明确的整段历史用分区删除
  • TO VOLUME 或 TO DISK 引用的卷名写错或未在存储配置中定义,建表就会失败,分层方案要先验证存储配置
  • TTL 的 WHERE 条件写错会让部分数据永远不被淘汰,变更 TTL 后应抽样确认老数据确实按预期被处理

数据来源与参考

  • ClickHouse Docs: TTL
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌