现象:
日志保留31天, 但是发现1年前的数据还有。
表结构:
bash
CREATE TABLE
ads_xxxx_metrics_1m_local (
`static_time` String COMMENT '统计时间',
......
) ENGINE = ReplacingMergeTree (process_time)
PARTITION BY
toYYYYMMDD (toDate (static_time))
ORDER BY
(
static_time,
xxx
real_time_type
) TTL parseDateTimeBestEffort (static_time) + toIntervalDay (31)
定位:
是因为删除数据速度 赶不上插入数据速度,造成历史数据无法被清理。
优化:
TTL 删除数据按照 分区时间删除。
bash
`TTL parseDateTimeBestEffort (static_time) + toIntervalDay (31) 这个改成 toDate (static_time) + toIntervalDay (31)`
加速删除数据的速度。
历史使用通过删除分区的方式删除。
bash
select
*
from
system.parts
where
table = 'xxxxx';
通过 partition 字段查找 需要删除的分区。
alter table table_namexxxx DROP PARTITION '20231125';
注意:
bash
为什么optimize后数据TTL仍未生效?
常见原因及解决方案如下。
常见原因1:数据的TTL淘汰是在主键合并阶段执行的,如果data part迟迟没有进行主键合并,那过期的数据就无法淘汰。
解决方案:
您可以通过手动optimize final或者optimize 指定分区的方式触发合并任务。
您可以在建表时设置merge_with_ttl_timeout、ttl_only_drop_parts等参数,提高含有过期数据data parts的合并频率。
常见原因2:表的TTL经过修改或者添加,存量的data part里缺少TTL信息或者不正确,这样也可能导致过期数据淘汰不掉。
解决方案:
您可以通过alter table materialize ttl命令重新生成TTL信息。
您可以通过optimize 分区更新TTL信息。