执行 OPTIMIZE TABLE your_table FINAL; 命令后,磁盘空间减少了,这是预期的行为。以下是原因和详细解释:
为什么磁盘空间会减少
-
1、数据合并:
OPTIMIZE TABLE ... FINAL 命令会强制 ClickHouse 合并数据部分(parts)。在 ClickHouse 中,数据是以分区和部分(parts)的形式存储的。每次插入数据时,都会创建新的数据部分。当你删除数据时,删除标记会被添加到这些部分中,而不是立即删除数据。 -
2、删除标记清理:
在执行 OPTIMIZE TABLE ... FINAL 命令时,ClickHouse 会合并这些数据部分,并清理被标记为删除的数据。这意味着实际的物理数据会被删除,从而释放磁盘空间。 -
3、数据压缩:
合并操作还会重新压缩数据。通过合并多个小的部分成为一个大的部分,数据压缩效果会更好,从而减少占用的磁盘空间。
进一步优化和检查
1、检查表的分区和数据部分:
你可以查看表的分区和数据部分,了解哪些部分占用了大量空间。
SELECT
partition,
name,
active,
formatReadableSize(bytes_on_disk) AS size
FROM system.parts
WHERE table = 'your_table'
ORDER BY bytes_on_disk DESC;
2、监控磁盘使用情况:
定期监控系统的磁盘使用情况,确保及时发现和处理磁盘空间问题。
SELECT
table,
formatReadableSize(sum(bytes)) AS total_size
FROM system.parts
WHERE active
GROUP BY table
ORDER BY total_size DESC;
- 执行以上sql后返回的内容
1. `trace_log` - 10.06 GiB
2. `part_log` - 4.70 GiB
3. `asynchronous_metric_log` - 4.40 GiB
4. `metric_log` - 3.98 GiB
5. `project_logs` - 1.36 GiB
-
2.1、手动清理旧数据
你也可以通过 SQL 语句手动删除旧的数据。例如:
-- 删除 30 天前的 trace_log 日志
ALTER TABLE system.trace_log DELETE WHERE event_date < today() - 30;
-- 删除 30 天前的 query_log 日志
ALTER TABLE system.query_log DELETE WHERE event_date < today() - 30;
-- 删除 30 天前的 part_log 日志
ALTER TABLE system.part_log DELETE WHERE event_date < today() - 30;
-- 删除 30 天前的 asynchronous_metric_log 日志
ALTER TABLE system.asynchronous_metric_log DELETE WHERE event_date < today() - 30;
-- 删除 30 天前的 metric_log 日志
ALTER TABLE system.metric_log DELETE WHERE event_date < today() - 30;
-
2.2、 优化日志表
在清理完旧数据后,执行 OPTIMIZE TABLE
命令来释放磁盘空间:
OPTIMIZE TABLE system.trace_log FINAL;
OPTIMIZE TABLE system.query_log FINAL;
OPTIMIZE TABLE system.part_log FINAL;
OPTIMIZE TABLE system.asynchronous_metric_log FINAL;
OPTIMIZE TABLE system.metric_log FINAL;
-
2.3、检查和优化用户表
对于用户表(如 project_logs
和 samples
),你可以执行类似的操作来清理和优化数据:
-- 删除旧数据
ALTER TABLE project_logs DELETE WHERE event_date < today() - 30;
-- 优化表
OPTIMIZE TABLE project_logs FINAL;
3、配置自动合并:
配置 ClickHouse 进行自动合并,以减少手动维护的需求。你可以在表创建时或通过 ALTER TABLE 命令来设置合并参数。
ALTER TABLE your_table MODIFY SETTING merge_with_ttl_timeout = 3600;
4、定期维护:
定期执行维护操作,如 OPTIMIZE TABLE,以确保数据不会长期积累。
总结
执行 OPTIMIZE TABLE your_table FINAL; 命令后磁盘空间减少,是因为该命令强制合并和清理了被标记为删除的数据,从而释放了磁盘空间。这是 ClickHouse 数据管理的正常行为。通过定期维护和监控,你可以有效管理 ClickHouse 的磁盘空间使用情况。