分区运维解决什么
ClickHouse 的 MergeTree 表按 PARTITION BY 表达式把数据切成若干分区,每个分区由多个 part 组成。分区级运维不是删数据重写全表,而是直接对分区目录做摘除与挂载:DETACH 把分区移出可见范围但保留磁盘文件,ATTACH 把它重新挂回,FREEZE 用硬链接做一份几乎不占用额外空间的快照。三者都只动元数据,执行很快,因此被广泛用于归档、迁移、误操作回滚与备份。
基本信息
| 适用引擎 | MergeTree 家族(含 ReplicatedMergeTree 副本表) |
|---|---|
| DETACH | ALTER TABLE t DETACH PARTITION '202406',文件移到表目录下的 detached/ |
| ATTACH | ALTER TABLE t ATTACH PARTITION '202406',重新参与查询 |
| FREEZE | ALTER TABLE t FREEZE PARTITION '202406' WITH NAME 'bak',在 shadow 目录生成硬链接快照 |
| 清理 detached | ALTER TABLE t DROP DETACHED PARTITION '202406' SETTINGS allow_drop_detached = 1 |
典型使用场景
- 冷数据归档:先 DETACH 再拷走分区文件,最后清理 detached 目录
- 误操作回滚:发现分区数据有问题,用 ATTACH 把之前 DETACH 的分区挂回
- 跨集群克隆:FREEZE 出快照后把 shadow 目录拷到目标机器,再在目标表上 ATTACH
- 存储分层:把历史分区 MOVE 到低成本磁盘或卷,保持查询可用
- 分区合并异常或单分区写坏时先 DETACH 止血,再单独排查该分区
操作示例
操作示例
-- 先看分区与 part 分布,确认分区表达式与命名
SELECT partition, count() AS parts, sum(rows) AS rows FROM system.parts
WHERE table = 'events' AND active GROUP BY partition ORDER BY partition;
-- 摘除分区:数据仍在本机 detached 目录,可随时挂回
ALTER TABLE events DETACH PARTITION '202406';
-- 重新挂回(分区数据回到表内,立即可查)
ALTER TABLE events ATTACH PARTITION '202406';
-- 生成硬链接快照,随后用文件工具把 shadow 目录拷到备份机
ALTER TABLE events FREEZE PARTITION '202406' WITH NAME 'events-202406';
-- 确认 detached 内容后再清理(需显式开启 allow_drop_detached)
-- ALTER TABLE events DROP DETACHED PARTITION '202406' SETTINGS allow_drop_detached = 1;操作对照读法
| 操作 | 效果 | 风险与注意 |
|---|---|---|
| DETACH PARTITION | 分区移出可见范围,文件保留在 detached 目录 | 查询不再包含该分区,但磁盘占用不减 |
| ATTACH PARTITION | 把 detached 中的分区挂回表内 | 分区数据与表结构表达式不匹配时会挂载失败 |
| DROP PARTITION | 删除分区数据 | 数据随 part 清理而移除,无法用 ATTACH 找回 |
| FREEZE PARTITION | 在 shadow 目录生成硬链接快照 | 只在本机,需及时拷走;占用空间直到快照删除才释放 |
| DROP DETACHED | 删除 detached 目录中的分区文件 | 需 allow_drop_detached=1,删后不可恢复 |
复制表上的 DETACH、ATTACH、DROP 属于 DDL,会写入复制日志同步到其他副本;但表目录下 detached 子目录里的文件是本机文件,跨集群迁移仍要逐副本拷贝后再挂载。
FREEZE 不会复制数据,源分区文件一旦被 DROP 或磁盘损坏,快照与源数据会一起丢失;快照生成后应尽快备份到独立存储,并确认备份可读后再决定是否删除。