ClickHouse 数据迁移实战:从旧服务到新服务
记一次 ClickHouse 表级数据迁移操作
📋 背景
一次磁盘满,使用了新的 ck , 换了数据目录,稳定跑一段时间后,需要同步旧数据到新的 ck
🏗️ 环境概览
| 项目 | 旧服务 | 新服务 |
|---|---|---|
| 容器名 | old-coze-loop-clickhouse |
coze-loop-clickhouse |
| 状态 | Up 12 days (healthy) | Up 12 minutes (healthy) |
| HTTP 端口 | 8123 (内部) | 8123 映射至 8323,9000 映射至 9300 |
| Native 端口 | 9000 | 9000 |
🔧 操作步骤
第一步:网络连通
将旧容器连接到新容器所在的 Docker 网络,确保两者网络互通:
1 | docker network connect coze-loop-network old-coze-loop-clickhouse |
为什么要连接网络?
ClickHouse 的remote()函数需要跨实例访问数据,网络连通是前提条件。
第二步:进入新服务客户端
1 | docker exec -it coze-loop-clickhouse bash |
第三步:调整性能参数
1 | SET max_threads = 16; |
| 参数 | 值 | 说明 |
|---|---|---|
max_threads |
16 | 并行查询的最大线程数 |
max_insert_threads |
8 | 并行写入的最大线程数 |
max_memory_usage |
0 | 0 表示不限制内存使用,避免迁移时 OOM |
第四步:停止合并任务
1 | SYSTEM STOP MERGES `cozeloop-clickhouse`.observability_spans; |
为什么要停止合并?
在数据导入期间禁止 MergeTree 表的合并操作,可以显著提升写入性能,避免后台合并与数据插入抢占资源。
第五步:远程写入数据
1 | INSERT INTO `cozeloop-clickhouse`.observability_spans |
第六步:恢复合并 & 优化
1 | SYSTEM START MERGES `cozeloop-clickhouse`.observability_spans; |
为什么要 OPTIMIZE?
- 恢复合并后,后台会重新处理 part 文件
OPTIMIZE FINAL强制立即触发一次完整合并,清理碎片,提升查询性能
⚡ 性能优化要点总结
1 | ┌─────────────────────────────────────────────────┐ |
⚠️ 注意事项
- 网络连通性 — 迁移前务必确认两个 ClickHouse 实例网络互通
- 数据一致性 — 建议在业务低峰期操作,或先停止写入端
- 磁盘空间 — 确保目标服务有足够存储空间接收数据
- 迁移后验证 — 可通过
SELECT count() FROM table对比数据量
📊 效果
通过以上配置,ClickHouse 在迁移过程中能以最大性能运行,迁移完成后通过 OPTIMIZE TABLE 整理数据,确保新服务快速进入最优查询状态。