写点什么

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

作者:一农
  • 2022 年 5 月 19 日
  • 本文字数:1013 字

    阅读完需:约 3 分钟

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

背景

clickhouse 有很多系统表(参见https://clickhouse.com/docs/en/operations/system-tables),其中一些用来存储日志,比如 query_log、query_thread_log、trace_log。默认情况下,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:直接删除分区

salter 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 数据目录下创建一个标记文件,然后再次执行分区删除语句。文件名如下:

<clickhouse-path>/flags/force_drop_table

细节可参考官网文档https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings#max-table-size-to-drop

彻底解决

依靠人定期去检查和清理不是解决之道。可以设置日志表的 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>
复制代码

详情可参考官网文档:https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings#server_configuration_parameters-query-log

发布于: 刚刚阅读数: 3
用户头像

一农

关注

各位网友好,我是一农 2018.11.08 加入

半农+半农=1农

评论

发布
暂无评论
Clickhouse:日志表占用大量磁盘空间怎么办?_Clickhouse_一农_InfoQ写作社区