如何将2亿条ClickHouse数据行迁移至另一台服务器?
针对ClickHouse 2亿条数据迁移的优化方案
原Python+CSV+FTP方案的核心问题
- 效率极低:Python单进程拉取无法匹配ClickHouse的高并发查询能力,2亿条数据的拉取、转存会消耗大量时间
- 资源浪费:CSV是文本格式,相比ClickHouse原生列存格式,体积至少膨胀3-5倍,占用更多磁盘和传输带宽
- 容错性差:中间环节多(查询→存CSV→FTP→导入),任意一步出错都要重新执行,没有原生断点续传机制
推荐的高效迁移方案
方案1:ClickHouse原生跨节点INSERT SELECT(最优解,网络互通场景)
如果两台服务器能互相访问ClickHouse端口,直接用原生跨节点插入:
- 在目标服务器创建与源表结构、引擎、分区、索引完全匹配的表
- 执行跨节点插入SQL:
-- 可根据服务器配置调整并发数 SET max_insert_threads = 8; INSERT INTO target_db.target_table SELECT * FROM remote('source_host:9000', source_db.source_table, 'username', 'password') WHERE [你的过滤条件,筛选出目标2亿条数据];
- 优势:全程由ClickHouse原生引擎处理,利用列存高效传输特性,无中间文件,速度最快;自动处理分片失败,容错性强
- 注意:若数据量过大,可按分区分批迁移,避免单次写入压力过高
方案2:clickhouse-backup工具(离线/网络受限场景)
适合两台服务器无法直接互通的情况:
- 源服务器导出指定数据:
clickhouse-backup create --table source_db.source_table --where "[你的过滤条件]" backup_200m
- 用SCP/RSYNC将压缩后的备份文件传输到目标服务器(体积远小于CSV)
- 目标服务器恢复数据:
clickhouse-backup restore --table target_db.target_table backup_200m
- 优势:备份文件为ClickHouse原生压缩格式,传输效率高;支持增量备份与断点续传,容错性强
方案3:clickhouse-client原生格式导出/导入
不想用备份工具时的轻量方案:
- 源服务器导出原生格式数据:
clickhouse-client --host source_host --query "SELECT * FROM source_db.source_table WHERE [过滤条件]" --format Native > data_200m.native
- 传输
data_200m.native到目标服务器 - 目标服务器导入:
clickhouse-client --host target_host --query "INSERT INTO target_db.target_table FORMAT Native" < data_200m.native
- 优势:原生格式读写效率比CSV高数倍,操作简单,仅依赖官方客户端
总结
优先选择方案1(跨节点直接插入),网络受限则选方案2或3。Python脚本转CSV的方案完全没必要——既浪费资源,又拖慢迁移速度,容错性还差。
内容的提问来源于stack exchange,提问作者Andrey Mihaylov
相关产品推荐
相关产品推荐

