本文介绍如何将自建 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 来查询数据表分区的大小:
SELECTdatabase,table,partition,count(),formatReadableSize(sum(bytes_on_disk))FROM system.partsWHERE activeGROUP BYdatabase,table,partitionORDER BYdatabase 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
说明: