ClickHouse 集群迁移方案

最近更新时间:2025-08-04 14:42:03

我的收藏
本文介绍如何将自建 IDC 或其他云平台上的 ClickHouse 集群的数据迁移至腾讯云数据仓库 TCHouse-C 集群。在数据迁移之前,确保自建集群与目标集群之间网络互通。

1. 数据库表 Schema 迁移

通过执行 SELECT DATABASE,TABLE FROM system.tables WHERE database != 'system' 来确定数据库中所有的表。
在源数据库中 database.table 可以查询该表的 DDL 语句。
clickhouse-client --host $CHICKHOUSE_HOST --port $CLICKHOUSE_PORT --user $USER --password $PASSWORD -q "SHOW CREATE database.table" > database.table.sql
获取包含 DDL 语句的文件,在新集群中执行。其中,CLICKHOUSE_HOST 和 CLICKHOUSE_PORT 是源服务入口,USER 和 PASSWORD 是用户名和密码。操作步骤如下:
在新集群中创建对应的数据库:
clickhouse-client --host $TENCENT_CHICKHOUSE_HOST --port $TENCENT_CLICKHOUSE_PORT --user $USER --password $PASSWORD -q "CREATE DATABSE database"
创建表:
clickhouse-client --host $TENCENT_CHICKHOUSE_HOST --port $TENCENT_CLICKHOUSE_PORT --user $USER --password $PASSWORD > database.table.sql
其中,TENCENT_CLICKHOUSE_HOST 和 TENCENT_CLICKHOUSE_PORT 是腾讯云数据仓库 TCHouse-C 服务的入口,USER 和 PASSWORD 是用户名和密码。

2. 通过 Remote 函数进行数据迁移

在数据规模较少的情况下,可以通过 Remote 函数,将源集群的数据直接迁移至新集群中。执行如下 SQL:
INSERT INTO target_database.table
SELECT *
FROM remote('source_cluster',source_database.table,$USER,$PASSWORD)
该方案优势在于简单且可靠性高,但较为依赖网络传输效率。若因网络问题出现超时,可能需要重新导入数据。同时在迁移过程中,可能会对源集群造成一定的读压力,建议在业务低峰期操作。
在数据规模较大时(百 GB 级及以上),可以按照更细粒度的条件分批迁移(如按分区、天、小时等),例如按天进行迁移:
INSERT INTO target_database.table
SELECT *
FROM remote('source_cluster',source_database.table,$USER,$PASSWORD)
WHERE event_date = '2025-05-25'
或者按照日期区间进行迁移:
INSERT INTO target_database.table
SELECT *
FROM remote('source_cluster',source_database.table,$USER,$PASSWORD)
WHERE event_date BETWEEN '2025-06-01' AND '2025-06-30'
说明:
在数据规模较大时,建议采用本地表对本地表的迁移模式,直写目标集群的分布式表可能导致内存不足或者出现 Too many parts 报错。
可通过如下 SQL 来查询数据表分区的大小:
SELECT
database,
table,
partition,
count(),
formatReadableSize(sum(bytes_on_disk))
FROM system.parts
WHERE active
GROUP BY
database,
table,
partition
ORDER BY
database ASC,
table ASC,
partition ASC

3. 通过导出/导入数据文件进行数据迁移

将数据从源集群中导出到文件,并将该文件导入到新集群中。操作步骤如下:
数据导出:
clickhouse-client --host $CHICKHOUSE_HOST --port $CLICKHOUSE_PORT --user $USER --password $PASSWORD -q "SELECT * FROM database.table FORMAT CSV" > database.table.dat
数据导入:
clickhouse-client --host $TENCENT_CHICKHOUSE_HOST --port $TENCENT_CLICKHOUSE_PORT --user $USER --password $PASSWORD -q "INSERT INTO database.table FORMAT CSV" < database.table.dat
说明:
此处可选择多种数据格式,ClickHouse 可支持的格式请参见 官方文档

4. 通过 JDBC 完成数据迁移

如果有后备数据源,还可以通过 JDBC 将数据重新写入到腾讯云数据仓库 TCHouse-C 集群中。关于 JDBC 写入详情请见 官方文档