日志说明
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 的删除操作是 异步后台任务(称为 "Mutation"),执行流程:提交任务:语句触发后,立即在表元数据中记录一个“突变”条目。后台执行:ClickHouse 在后台逐块扫描数据并标记删除。合并清理:旧数据在下次合并(Merge)时物理删除。
查询系统库表占用
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-307346e99118Ok.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-38a54d9f14e8Ok.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;