clickhouse 日志文件
日志说明
metric_log
功能:记录 ClickHouse 的实时监控指标(如 CPU、内存、磁盘、查询数等),默认每分钟写入一次。
数据内容:event_time, metric, value。
影响:高频写入,长期积累可能占用较大磁盘空间;读取时可能短暂占用内存。
优化建议:
启用 TTL:保留最近 7 天数据。
ALTER TABLE system.metric_log MODIFY TTL event_date + INTERVAL 7 DAY;
降低写入频率:在 config.xml 中调整采集间隔(需重启服务):
<metric_log>
<flush_interval_milliseconds>60000</flush_interval_milliseconds> <!-- 默认 1 分钟 -->
</metric_log>
asynchronous_metric_log
功能:记录异步采集的系统级监控指标(如操作系统资源使用率),更新频率较低(默认 10 秒)。
数据内容:event_time, metric, value。
影响:低频写入,磁盘占用较小,对内存影响可忽略。
优化建议: 调整采集间隔(非必要不建议修改)
<asynchronous_metric_log>
<flush_interval_milliseconds>30000</flush_interval_milliseconds> <!-- 改为 30 秒 -->
</asynchronous_metric_log>
trace_log
功能:记录内部操作的详细追踪信息(如线程活动、锁竞争),用于深度性能分析。
数据内容:event_time, trace_type, thread_id, query_id。
影响:仅在开启追踪时写入(默认关闭),对生产环境性能有轻微影响。
text_log
功能:记录 ClickHouse 服务的运行日志(类似传统日志文件),包括错误、警告、信息级消息。
数据内容:event_time, thread_id, log_level, message。
影响:日志级别越低(如 trace),写入越频繁,可能占用更多内存和磁盘。
优化建议:
提高日志级别:仅记录警告及以上。
<text_log>
<level>warning</level> <!-- 可选:trace, debug, information, warning, error -->
</text_log>
限制日志大小:
<text_log>
<max_size_rows>500000</max_size_rows>
<buffer_size_rows_flush_threshold>250000</buffer_size_rows_flush_threshold>
</text_log>
latency_log
功能:记录慢查询的延迟详情(需手动开启),用于分析查询性能瓶颈。
数据内容:query_id, event_time, duration_ms, query。
影响:仅在慢查询触发时写入,对系统影响小。
优化建议:
按需配置阈值:
<latency_log>
<enable>1</enable>
<threshold_ms>1000</threshold_ms> <!-- 记录超过 1 秒的查询 -->
</latency_log>
query_log
功能:记录所有执行过的查询详情(包括成功/失败的查询)。
数据内容:query_id, query, user, duration_ms, memory_usage。
影响:高频写入,可能成为磁盘和内存的小负担。
优化建议:
启用 TTL 清理:
ALTER TABLE system.query_log MODIFY TTL event_date + INTERVAL 3 DAY;
过滤敏感查询:避免记录含敏感信息的查询。
<query_log>
<log_queries=0</log_queries> <!-- 完全关闭(不推荐) -->
</query_log>
processors_profile_log
功能:记录查询执行过程中各处理器的性能数据(用于分析查询流水线瓶颈)。
数据内容:event_time, processor_name, elapsed_us, rows。
影响:默认关闭,开启后对性能有轻微影响。
优化建议: 按需启用
<processors_profile_log>
<enabled>1</enabled> <!-- 默认关闭 -->
</processors_profile_log>
error_log
功能:记录 ClickHouse 运行时的错误事件(如启动失败、崩溃)。
数据内容:event_time, error_code, message。
影响:低频写入,占用极低。
part_log
功能:记录 MergeTree 引擎表的分区操作(如合并、下载、删除)。
数据内容:event_type, table, partition_id, duration_ms。
影响:对系统性能影响可忽略,但高频分区操作可能积累数据。
优化建议:清理旧日志
ALTER TABLE system.part_log DELETE WHERE event_date < today() - 7;
删除执行过程说明
删除操作的两阶段流程
ClickHouse 的删除操作并非立即物理删除数据,而是分两步完成:
逻辑删除(标记阶段)
当执行 ALTER TABLE ... DELETE 语句时:
目标数据会被标记为 "已删除"(更新元数据)。
数据文件仍保留在磁盘上,但查询时会自动过滤这些数据。
此时磁盘空间不会释放,仅逻辑上不可见。
物理删除(合并阶段)
在后台的 Merge 过程 中:
ClickHouse 合并多个数据分片(parts)时,自动跳过已标记删除的数据。
合并后的新分片不再包含已删除数据,旧分片文件被移除。
此时磁盘空间真正释放。
合并触发的条件
Merge 操作由 ClickHouse 后台任务自动触发,条件包括:
数据分片数量达到阈值:默认当同一分区有多个小分片时触发合并。
手动强制执行:通过 OPTIMIZE TABLE [table] FINAL 命令立即触发合并。
TTL 机制:当数据过期时自动触发合并以清理空间
查询系统库表占用
SELECT
table,
formatReadableSize(sum(bytes_on_disk)) AS disk_size
FROM system.parts
WHERE database = 'system'
GROUP BY table
ORDER BY disk_size DESC;
┌─table─────────┬─disk_size ┐
1. │ processors_profile_log │ 69.81 GiB │
2. │ query_views_log │ 5.25 GiB │
3. │ trace_log │ 49.58 GiB │
4. │ metric_log │ 4.74 GiB │
5. │ asynchronous_metric_log │ 4.23 GiB │
6. │ error_log │ 340.82 KiB │
7. │ part_log │ 19.59 GiB │
8. │ text_log │ 167.21 GiB │
9. │ query_log │ 113.69 GiB │
└─────────── ─┴──────┘
清理日志
text_log
方法一
-- 清理 7 天前的数据(假设有时间字段 `event_time`)
ALTER TABLE system.text_log DELETE WHERE event_time < now() - toIntervalDay(7);
Query id: 5287d612-2c47-43c7-90f7-307346e99118
Ok.
0 rows in set. Elapsed: 0.016 sec.
强制合并释放(可选)
OPTIMIZE TABLE system.text_log FINAL;
方法二
drop table system.text_log;
Query id: 301ae000-6a6c-4ac8-b8ef-38a54d9f14e8
Ok.
0 rows in set. Elapsed: 0.039 sec.
查看 Mutation 任务
SELECT * FROM system.mutations WHERE table = 'text_log';
Row 1:
──────
database: system
table: text_log
mutation_id: mutation_2014899.txt
command: DELETE WHERE event_time < (now() - toIntervalDay(7))
create_time: 2025-03-06 12:41:57
block_numbers.partition_id: ['']
block_numbers.number: [2014899]
parts_to_do_names: ['202502_1763937_1880472_11_1845452','202502_1880473_1924005_8','202502_1924006_1937260_6','202502_1937261_1952389_24','202503_1953027_1964232_7','202503_1964233_1974831_7','202503_1974832_1984011_7','202503_1984012_1993142_7','202503_1993143_2000845_7','202503_2000846_2002831_5','202503_2002832_2004782_5','202503_2004783_2006468_5','202503_2006469_2008063_5','202503_2008064_2009521_5','202503_2009522_2011077_5','202503_2011078_2012245_5','202503_2012246_2012575_4_2014898','202503_2012576_2012846_4_2014898','202503_2012847_2013176_4_2014898','202503_2013177_2013420_4_2014898','202503_2013421_2013682_4_2014898','202503_2013683_2013921_4_2014898','202503_2013922_2014179_4_2014898','202503_2014180_2014375_4_2014898','202503_2014376_2014597_4_2014898','202503_2014598_2014773_4_2014898']
parts_to_do: 26
is_done: 0
is_killed: 0
latest_failed_part: 202503_2014598_2014773_4_2014898
latest_fail_time: 2025-03-06 12:43:14
latest_fail_reason: Code: 243. DB::Exception: Cannot reserve 300.02 MiB, not enough space. (NOT_ENOUGH_SPACE) (version 24.8.4.13 (official build))
1 row in set. Elapsed: 0.003 sec.
is_done = 1 表示任务完成。
未完成的任务会阻塞后续同类操作。
优化清理
按时间删除
-- 清理 7 天前的数据(假设有时间字段 `event_time`)
ALTER TABLE system.text_log DELETE WHERE event_time < now() - toIntervalDay(7);
配置 TTL 自动清理
-- 添加 TTL 规则(按时间自动过期)保留3天
ALTER TABLE system.text_log MODIFY TTL event_time + INTERVAL 3 DAY;
调整日志配置
修改 config.xml 配置文件
<!-- 限制日志表最大行数 -->
<text_log>
<max_size_rows>500000</max_size_rows> <!-- 保留50万行 -->
<buffer_size_rows_flush_threshold>250000</buffer_size_rows_flush_threshold>
</text_log>
<query_log>
<max_size_rows>500000</max_size_rows> <!-- 50万行 -->
<ttl>259200</ttl> <!-- 3天过期 -->
</query_log>
systemctl restart clickhouse-server
验证优化效果
检查清理后空间释放
SELECT table, formatReadableSize(sum(bytes_on_disk)) AS disk_size FROM system.parts WHERE database = 'system' AND table LIKE '%_log' GROUP BY table;
监控日志写入频率
SELECT event_time, count() FROM system.text_log GROUP BY event_time ORDER BY event_time DESC LIMIT 10;

浙公网安备 33010602011771号