欢迎光临
我们一直在努力

Clickhouse:日志表占用大量磁盘空间怎么办?

查看日志表的大小

可以通过system.parts查看各个表的大小。

SELECT 
    sum(rows) AS `总行数`,
    formatReadableSize(sum(data_uncompressed_bytes)) AS `原始大小`,
    formatReadableSize(sum(data_compressed_bytes)) AS `压缩大小`,
    round((sum(data_compressed_bytes) / sum(data_uncompressed_bytes)) * 100, 0) AS `压缩率`,
    `table` AS `表名`
FROM system.parts where database = 'system' group by `table`

结果如下:

清理日志数据

有2种删除方法

方法1:使用clickhouse的mutation语句

alter table system.query_log delete where event_date < '2022-01-01'

这种方法效率较低

方法2:直接删除分区

alter table system.query_log drop partition '202201';

默认情况下,日志是按月存储的。分区信息也可以在system.parts里查询到

SELECT * FROM system.parts where database = 'system' and `table`= 'query_log'

需要注意,当分区太大时,会删除失败。错误信息如下:

Size (154.47 GB) is greater than max_[table/partition]_size_to_drop (50.00 GB)

解决办法是在clickhouse数据目录下创建一个标记文件,然后再次执行分区删除语句。文件名如下:

/flags/force_drop_table

细节可参考官网文档Server Settings | ClickHouse Docs

彻底解决

依靠人定期去检查和清理不是解决之道。可以设置日志表的TTL来自动清理数据。例如保存15天的日志可以使用以下SQL:

ALTERTABLE query_log MODIFY TTL event_date  toIntervalDay(15);

更好的办法是在系统配置文件配置:

<query_log>
    <database>system</database>
    <table>query_log</table>
    <engine>Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date   INTERVAL 30 day</engine>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>

详情可参考官网文档:Server Settings | ClickHouse Docs

赞(0) 打赏
转载请注明来源:IT技术资讯 » Clickhouse:日志表占用大量磁盘空间怎么办?

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏