本节摘要:备份是出事时的保险。本节讲 ClickHouse 的几种备份方式(part 拷贝、clickhouse-backup、S3 冷备)、恢复流程、容灾规划,让你能从故障中把数据救回来。
阅读完本节,你应当能够:
很多人觉得"有副本就不用备份了",这是误解。副本防的是单机故障,防不了:
DROP TABLE、DELETE FROM 误删,副本也会同步删掉。副本是高可用手段,备份是数据安全手段,两者不能互相替代。生产必须有备份。
最朴素的方式——把数据目录里的 part 拷到备份存储。MergeTree 的 part 是自包含的(一个 part 目录有完整数据),拷走就能恢复。适合手动备份小表。
# 找到 part 路径 ls /var/lib/clickhouse/data/default/events/20240615_1_1/ # 拷到备份位置 cp -r /var/lib/clickhouse/data/default/events/20240615_1_1 /backup/events_20240615/
恢复时把 part 拷回数据目录,ALTER TABLE ... ATTACH PARTITION 挂载。
社区工具 clickhouse-backup 能做完整的备份恢复,支持本地和 S3。它创建快照式备份,能按表或全库备份,恢复也方便。
clickhouse-backup create my_backup_20240615 clickhouse-backup upload my_backup_20240615 # 上传到 S3 clickhouse-backup download my_backup_20240615 # 从 S3 下载 clickhouse-backup restore my_backup_20240615
这是生产最常用的方式,配合定时任务做日常备份。
ClickHouse 支持把冷数据存到 S3(Tiered Storage 或 S3 表引擎),相当于一份异地副本。配合 TTL 把冷数据自动迁到 S3,既省本地磁盘又有冷备。

光有方式不够,还要有策略:
| 数据重要性 | 备份频率 | 保留 | 存储 |
|---|---|---|---|
| 核心 | 每天全备+增量 | 本地7天+异地30天 | 异地 S3 |
| 一般 | 每天增量 | 本地7天 | 本地+异地 |
| 冷数据 | 低频 | 长期 | S3 冷备 |
出事时的恢复流程:
备份是基础,容灾更进一步——保证故障时业务能快速恢复:
⚠️ 常见坑:只备份不演练,真出事才发现备份损坏、恢复流程不会操作。定期演练是唯一能保证"备份真有用"的办法——至少每季度做一次恢复演练。
💡 关键直觉:副本防单机故障,备份防误操作和集群级故障,两者不能替代。备份要异地、要演练、要验证,"备份了"不等于"能恢复"。
下一节讲安全控制——权限、TLS、配额,给集群加护栏。
备份的价值在恢复,恢复能力只能靠演练验证。下面是一次最小演练的完整步骤,建议在测试环境按这个流程走一遍:
# 1. 创建备份 clickhouse-backup create daily_$(date +%Y%m%d) # 2. 模拟故障:误删一张表 clickhouse-client --query "DROP TABLE default.events" # 3. 确认误删后从备份恢复 clickhouse-backup restore daily_$(date +%Y%m%d) --table default.events # 4. 验证数据完整 clickhouse-client --query "SELECT count(), max(event_time) FROM default.events"
演练的关键是验证"恢复后数据对不对",而不仅是"恢复命令不报错"。比对备份前的行数、最大值,确认数据完整才叫恢复成功。这类演练建议至少每季度一次,并记录实际花费的时间(RTO 的实测值)。
备份的粒度也值得规划。全库备份简单但耗时长,按表备份灵活。核心表可以每天全备,次要表每周备一次。冷热数据分开处理:热数据高频备份,冷数据靠 S3 上的副本本身就不容易丢。把备份策略和业务重要性对齐,资源花在刀刃上。
最后补一个容易被忽略的细节:备份要验证可读性。clickhouse-backup list 能列出所有备份,clickhouse-backup check 能做完整性检查。把这些检查也做成定时任务,备份体系才算闭环——"备份了"不等于"能恢复",验证过才算数。