首页/数据/NoSQL 速查/分区运维:DETACH / ATTACH / FREEZE
ClickHouse56 条

分区运维:DETACH / ATTACH / FREEZE

分区级运维不重写全表:DETACH PARTITION 下线分区数据,ATTACH 重新挂载,FREEZE 创建硬链接快照用于备份;是迁移与回滚的轻量手段。

NoSQL 速查数据更新于 2026-10-13

分区运维解决什么

ClickHouse 的 MergeTree 表按 PARTITION BY 表达式把数据切成若干分区,每个分区由多个 part 组成。分区级运维不是删数据重写全表,而是直接对分区目录做摘除与挂载:DETACH 把分区移出可见范围但保留磁盘文件,ATTACH 把它重新挂回,FREEZE 用硬链接做一份几乎不占用额外空间的快照。三者都只动元数据,执行很快,因此被广泛用于归档、迁移、误操作回滚与备份。

基本信息

适用引擎MergeTree 家族(含 ReplicatedMergeTree 副本表)
DETACHALTER TABLE t DETACH PARTITION '202406',文件移到表目录下的 detached/
ATTACHALTER TABLE t ATTACH PARTITION '202406',重新参与查询
FREEZEALTER TABLE t FREEZE PARTITION '202406' WITH NAME 'bak',在 shadow 目录生成硬链接快照
清理 detachedALTER 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 或磁盘损坏,快照与源数据会一起丢失;快照生成后应尽快备份到独立存储,并确认备份可读后再决定是否删除。

易错点

  • 用 DROP PARTITION 替代 DETACH 做归档:数据被直接清理,发现选错分区时无法回滚
  • FREEZE 之后一直不拷走也不 UNFREEZE:硬链接让旧数据块无法被回收,磁盘空间持续被占住
  • 在副本表上直接手工删表目录里的文件:绕过复制流程,各副本分区集合不一致,后续可能报 part 校验错误
  • 把定期清理交给手工 DETACH:忘了执行就持续膨胀,按月/按天过期应交给 TTL 或物化视图自动化

数据来源与参考

  • ClickHouse Docs: Partition operations
  • ClickHouse Docs: FREEZE
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌