全部产品
Search
文档中心

云数据库 ClickHouse:将自建ClickHouse迁移至云数据库 ClickHouse 企业版

更新时间:Feb 10, 2026

本文介绍如何通过控制台或手动迁移方式将自建ClickHouse迁移到云数据库 ClickHouse 企业版集群。

前提条件

  • 自建集群:已创建数据库账号和密码,且账号权限需具备库表读权限、SYSTEM命令执行权限(如果需要迁移涉及账户密码的外表,要求账户有displaySecretsInShowAndSelect权限)。

  • 目标集群:已创建数据库账号和密码,且具备最高权限

  • 网络连通性

    • 如果自建集群和目标集群位于同一个VPC下,您还需要将目标集群所有节点的IP地址以及其交换机的IPv4网段,添加到自建集群的白名单中。

      • 云数据库ClickHouse中如何添加白名单,请参见设置白名单

      • 自建集群如何添加白名单,请参见自身产品文档。

      • 可通过SELECT * FROM system.clusters WHERE internal_replication = 1; 查看云数据库ClickHouse集群所有节点的IP地址。

    • 如果自建集群和目标集群位于不同VPC,或自建集群位于本地IDC或其他云厂商时,请先解决网络问题,具体操作请参见如何解决目标集群与数据源网络互通问题?

      说明

      在此情况下,为避免不同VPC之间的网段冲突问题,可能会出现IP映射的情况,若您做了IP映射相关的操作,则映射后的IP也需要添加到两端集群的白名单中。

迁移验证

在您正式开始迁移数据前,强烈建议您创建一个测试环境,以验证业务的兼容性、性能以及迁移是否能够顺利完成。在迁移验证完成后,再在生产环境中进行数据迁移。这一步骤至关重要,它可以帮助您提前识别并解决潜在问题,确保迁移过程顺利,并且避免对生产环境造成不必要的影响。

  1. 创建迁移任务,进行数据迁移。

  2. 性能瓶颈分析以及是否能完成迁移。

  3. 上云兼容性验证提供两种方式:

    1. 手工验证,请参见兼容性分析与解决

    2. 控制台验证,请参见(可选)检查SQL兼容性

选择方案

迁移方案

优点

缺点

适用场景

控制台迁移

可视化操作,无需手动迁移元数据。

只能进行整集群数据的全量和增量迁移,无法仅迁移指定的部分库表或部分历史数据。

整个集群数据迁移。

手动迁移

可自主控制迁移哪些库表数据。

操作繁杂,需要手动迁移元数据。

  • 部分库表数据迁移。

  • 单节点冷存数据超过1 TB。

  • 单节点热数据超过10 TB。

  • 无法满足控制台迁移条件的整个集群数据迁移。

操作步骤

控制台迁移

注意事项

迁移过程中

  • 目标集群进行迁移的库表会暂停合并(Merge),但自建集群不会。

    说明

    迁移数据时间过长,将会导致目标集群的元数据积累过多,建议迁移任务的持续时长不要超过5天。超过5天,任务将自动取消

  • 目标集群必须使用default集群。如果您自建集群的命名使用了其他名字,则会自动将分布式表中的cluster定义转化为default。

支持迁移的内容

说明

部分引擎的库表结构在迁移时,会发生转换,迁移后的引擎信息请参见下方。

  • 库结构:支持迁移的库引擎如下表所示。

    引擎名

    引擎转换说明

    Atomic

    Replaced with Replicated database

    Replicated

    无变化

    Ordinary

    Replaced with Replicated database

  • 表结构:支持迁移的表引擎如下表所示。

    引擎名

    引擎转换说明

    MaterializedView

    无变化

    View

    GenerateRandom

    Buffer

    URL

    Null

    Merge

    SharedMergeTree

    SharedVersionedCollapsingMergeTree

    SharedSummingMergeTree

    SharedReplacingMergeTree

    SharedAggregatingMergeTree

    SharedCollapsingMergeTree

    SharedGraphiteMergeTree

    MergeTree

    It will be replaced with SharedMergeTree

    ReplicatedMergeTree

    VersionedCollapsingMergeTree

    It will be replaced with SharedVersionedCollapsingMergeTree

    ReplicatedVersionedCollapsingMergeTree

    SummingMergeTree

    It will be replaced with SharedSummingMergeTree

    ReplicatedSummingMergeTree

    ReplacingMergeTree

    It will be replaced with SharedReplacingMergeTree

    ReplicatedReplacingMergeTree

    AggregatingMergeTree

    It will be replaced with SharedAggregatingMergeTree

    ReplicatedAggregatingMergeTree

    ReplicatedCollapsingMergeTree

    It will be replaced with SharedCollapsingMergeTree

    CollapsingMergeTree

    GraphiteMergeTree

    It will be replaced with SharedGraphiteMergeTree

    ReplicatedGraphiteMergeTree

  • 数据:增量迁移MergeTree族表的数据。

重要
  • 以上所示的库表结构能够正常迁移,其余库表结构需根据迁移过程中的警告、错误信息手动处理

  • 如果数据不满足以上条件,可选择手动迁移

集群影响

  • 自建集群

    • 读取自建集群过程中,自建集群的CPU和内存使用率会升高。

    • 不允许进行DDL操作。

  • 目标集群

    • 写入数据过程中,目标集群的CPU和内存使用率会升高。

    • 迁移的库表不允许进行DDL操作,不需要迁移的库表没有此限制。

    • 迁移中的库表停止merge,不需要迁移的库表不会停止merge。

    • 迁移结束后,集群会持续一段时间高频merge操作,这会导致IO使用率上升,从而引起业务请求的延迟增加。建议您计算迁移结束后的merge时间,提前规划以应对业务请求延迟的潜在影响。

步骤一:检查自建集群并开启使用系统表system

在数据迁移之前,需要根据自建集群是否已启用system.part_log和system.query_log,对config.xml文件进行修改配置,以实现增量迁移。

未启用system.part_log和system.query_log

如果您未启用system.part_logsystem.query_log,您需在config.xml文件中增加以下内容。

system.part_log
<part_log>
    <database>system</database>
    <table>part_log</table>
    <partition_by>event_date</partition_by>
    <order_by>event_time</order_by>
    <ttl>event_date + INTERVAL 15 DAY DELETE</ttl>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</part_log>
system.query_log
<query_log>
    <database>system</database>
    <table>query_log</table>
    <partition_by>event_date</partition_by>
    <order_by>event_time</order_by>
    <ttl>event_date + INTERVAL 15 DAY DELETE</ttl>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>

已启用system.part_log和system.query_log

  1. 您需根据下述内容,检查config.xml中system.part_logsystem.query_log的配置,如果存在不一致之处,需将其修改为以下配置,否则可能会导致迁移失败或迁移速度缓慢。

    system.part_log
    <part_log>
        <database>system</database>
        <table>part_log</table>
        <partition_by>event_date</partition_by>
        <order_by>event_time</order_by>
        <ttl>event_date + INTERVAL 15 DAY DELETE</ttl>
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>
    </part_log>
    system.query_log
    <query_log>
        <database>system</database>
        <table>query_log</table>
        <partition_by>event_date</partition_by>
        <order_by>event_time</order_by>
        <ttl>event_date + INTERVAL 15 DAY DELETE</ttl>
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>
    </query_log>
  2. 修改配置后,您还需执行语句drop table system.part_logdrop table system.query_log,在业务表插入数据后,会重新触发创建system.part_logsystem.query_log

步骤二:配置目标集群兼容自建集群版本

为确保目标集群与自建集群的行为尽可能兼容,需连接目标集群,修改compatibility参数,使目标集群与自建集群的版本号一致。

重要

若将compatibility设置到低版本,会导致ParallelRepica等部分新特性失效。

示例如下:

SELECT currentProfiles(); //获取用户使用的profile
SELECT
    profile_name,
    setting_name,
    value
FROM system.settings_profile_elements
WHERE (setting_name = 'compatibility') AND (profile_name = 'xxxx'); // 查询compatibility配置值
ALTER PROFILE XXXX SETTINGS compatibility = '23.8'; // 修改profile

步骤三:创建迁移任务

  1. 登录云数据库ClickHouse控制台,在集群列表页面,选择企业版实例列表,并单击目标集群ID。

  2. 在左侧导航栏,单击数据迁移及同步 > 从自建或云ClickHouse迁移

  3. 单击创建迁移任务

  4. 选择源及目标实例。

    配置项

    说明

    示例

    任务名称

    迁移任务名称,只能由大小写英文字母和数字组成,且不允许重复,大小写不敏感。

    MigrationTask1229

    源实例cluster名称

    通过SELECT * FROM system.clusters; 获取自建实例cluster名称。

    default

    VPC IP地址

    集群每个shard的IP和PORT地址,使用英文逗号隔开。格式:IP:PORT,IP:PORT,....

    您可以使用以下SQL获取自建集群的IP和PORT:

    SELECT shard_num, replica_num, host_address as ip, port FROM system.clusters WHERE cluster = '<cluster_name>' and replica_num = 1;

    参数说明:

    • cluster_name:目标集群的名字。

    • replica_num=1表示选择第一个副本集,也可以选择其他副本集或者自行挑选每个shard的一个副本组成。

    重要
    • 不能使用ClickHouse的VPC域名地址或者SLB地址。

    • 如果IP和端口发生转换后映射到阿里云,则需要根据网络打通情况配置对应的IP和PORT。

    192.168.0.5:9000,192.168.0.6:9000

    数据库账号

    自建集群数据库账号。

    test

    数据库密码

    自建集群数据库账号密码。

    test******

    源实例内核版本

    单击获取版本

    22.8.5.29

  5. 根据获取到的源实例版本信息,执行对应操作:

    • 源实例版本大于等于22.10:单击下一步

    • 源实例版本小于22.10:根据提示填写目标实例信息,单击下一步

    • 获取版本失败:源实例信息填写错误、网络未打通等情况会导致获取版本失败,请根据提示信息处理后,重新单击获取版本

    说明

    由于低版本社区版与企业版之间存在参数不兼容的问题,当源实例版本低于22.10时,需要通过源端向目的端推送数据的方式进行同步。在这种情况下,需要将目的端的IP映射至自建网络。如果自建网络与企业版实例处于同一 VPC,或双方网络已通过VPC对等连接连通,则可直接使用原有IP地址进行连接。

  6. 检查连通性和配置。

    1. 单击开始检查

      点击查看检查项。

      • 连通性验证:自建实例和目标实例之间的网络完全打通,两端各个节点之间能够互相访问。

      • 账户权限验证源端账户、密码输入正确,能够连接到源端实例。

      • 检查源实例系统表:自建实例必须有system.query_logsystem.partssystem.part_log三个系统表。

      • 检查配置:自建实例和目标实例时区相同、目标实例的compatibility配置项与源端版本相同

    2. 检查过程中可以单击右上角的image实时查看检查进度。

    3. 检查完成后,请根据检查结果,完成后续操作。

      您可以选择结果级别与检查项,然后单击image按钮,查看对应的检查结果,检查结果说明如下。

      • 成功:若所有检查项均通过,单击下一步继续操作。

      • 警告非强制卡点项,需自行确认该警告项是否会对业务和迁移任务造成影响。您可选择忽略告警,或根据告警内容处理对应的告警项后,再次单击开始检查,重新检查连通性与配置。

      • 错误强制卡点项,需根据错误内容处理对应的错误项后,再次单击开始检查,重新检查连通性与配置。

        检测报错信息以及解决方案,请参见常见问题

  7. 检查库表结构。

    1. 单击开始检查

    2. 检查过程中可以单击右上角的image实时查看检查进度。

    3. 检查完成后,请根据检查结果,完成后续操作。

      检查结果说明请参见步骤5。

  8. 库表结构迁移。

    1. 单击开始迁移

    2. 迁移过程中可以单击右上角的image实时查看迁移进度。

    3. 检查完成后,请根据检查结果,完成后续操作。

      检查结果说明请参见步骤5。

  9. (可选)检查SQL兼容性。

    SQL兼容性检查通过在目标实例上对自建实例的SQL语句进行回放,来验证不同内核版本的语法兼容性,请您根据自身需求,决定是否需要执行此步骤。

    • 无需执行,则单击跳过

    • 若需要执行,需选择请求重放时间后,再单击开始检查。检查通过后单击下一步,检查不通过时的处理方法请参见步骤5。

      重要
      • 实例库表无数据,仅提供验证语法兼容性的能力。如果需要有数据,可先执行下一步骤迁移部分数据。

      • 由于回放SQL的客户端版本和目标实例不匹配,可能存在误报。针对异常情况,您可以自行执行SQL验证。

  10. 启动同步。

    1. 单击开始同步

    2. 同步过程中可以单击右上角的image实时查看同步进度。

      同步过程中,支持执行停止重启取消迁移操作控制迁移流程,点击查看操作含义及影响等信息。

      操作

      功能含义

      影响

      使用场景

      停止

      立刻停止迁移数据,迁移剩余的库表结构。

      • 数据可能未完全迁移。

      • 在您重新发起迁移之前,必须先清理目标集群中已迁移的数据,避免出现数据重复的情况。

      • 全部数据迁移完成后,主动停止迁移任务。

      • 期望迁移一部分数据后测试,但是不想停写自建集群。

      重启

      在检查并清理其他库表、迁移数据、迁移剩余库表结构过程中出现异常,客户根据错误信息处理之后,将重试当前步骤,并正常执行后续步骤。

      迁移过程出现异常,客户根据提示信息解决之后想要断点重试

      取消迁移

      强制取消任务,跳过后续步骤。

      重要

      取消迁移后,该迁移任务将被锁定,即不允许修改迁移流程,您可通过上一步下一步刷新按钮查看迁移步骤执行结果。

      • 迁移任务强制终止,目标实例库表结构和配置可能不完整,不可作为业务正常使用。

      • 在您重新发起迁移之前,必须先清理目标集群中已迁移的数据,避免出现数据重复的情况。

      迁移任务影响了自建集群,希望尽快结束迁移,开启写入。

    3. 当执行到迁移数据时,切换到迁移数据页签,单击image按钮查看迁移进度预估剩余时间

      点击查看如何评估迁移是否可以完成

      迁移是否可以完成取决于迁移速度与自建集群写入速度的关系。

      • 迁移速度的测试实验数据如下

        数据表的Part平均大小

        源端实例规格

        源端磁盘规格

        目标端实例规格

        目标端存储介质

        集群节点数

        单节点迁移速度

        整体迁移速度

        402.54MB

        8C32G

        PL1

        16CCU

        OSS

        16

        47MB/s

        752.34MB/s

        402.54MB

        80C384G

        PL3

        48CCU

        ESSD_L2

        8

        197.74MB/s

        1581.95MB/s

      • 判断目标集群与自建集群的写入速度的关系:

        数据迁移的速度与part大小(在测试实验中,平均part大小在100MB~10GB的范围内,能够保持较快的迁移速度)、实例规格、磁盘规格、业务数据特性等要素相关,因此测试实验数据仅供参考。目标集群的真实写入速度需要您通过查看目标集群的磁盘吞吐来判断如何查看磁盘吞吐,请参见查看集群监控信息

        • 目标集群写入速度小于自建集群的写入速度:迁移失败率较高,建议您取消迁移任务,使用手动迁移进行数据迁移。

        • 目标集群写入速度大于自建集群的写入速度:可继续后续步骤,为提高迁移成功率,建议数据量 /(迁移速度-自建实例写入速度)所得的迁移所需时间小于等于 5天

      重要

      您需重点监控目标任务的迁移进度,根据预估剩余时间主动停写自建集群并处理Kafka和RabbitMQ引擎表。

      点击查看如何预估何时停写自建集群。

      业务切流前需要确保自建实例无新数据产生,进而保证迁移后数据的完整性。故需停止业务写入,并删除Kafka和RabbitMQ表,其具体操作如下:

      1. 登录自建集群,通过以下语句,查询需要处理的表。

        SELECT * FROM system.tables WHERE engine IN ('RabbitMQ', 'Kafka');
      2. 查看目标表的建表语句。

        SHOW CREATE TABLE <aim_table_name>;
      3. 连接目标集群,并执行上一步获取的建表语句。

      4. 登录自建集群,删除已经迁移了的Kafka和RabbitMQ引擎表。

        重要

        删除Kafka时,需同时删除引用Kafka表的物化视图,否则会导致物化视图迁移无法完成,最终导致迁移无法完成。

    4. 迁移进度为100%,且确认源端实例已经进入停写状态后,需要您单击停止按钮结束迁移流程,执行后续流程。

      image

    5. 同步完成后单击完成

      重要

      “启动同步”步骤完成后,该迁移任务将被锁定,即不允许修改迁移流程,您可通过上一步下一步刷新按钮查看迁移步骤执行结果。

步骤四:迁移非MergeTree类型表的业务数据

迁移任务中,非MergeTree类型的表仅支持迁移表结构(例如MySQL表)或者不支持迁移(例如Log表)。因此,迁移任务完成后,目标集群可能存在只有表结构,没有具体的业务数据的表,您需自主完成业务数据迁移,具体操作如下:

  1. 登录自建集群,查看需要迁移数据的非MergeTree类型的表。

    SELECT
        `database` AS database_name,
        `name` AS table_name,
        `engine`
    FROM `system`.`tables`
    WHERE (`engine` NOT LIKE '%MergeTree%') AND (`engine` != 'Distributed') AND (`engine` != 'MaterializedView') AND (`engine` NOT IN ('Kafka', 'RabbitMQ')) AND (`database` NOT IN ('system', 'INFORMATION_SCHEMA', 'information_schema')) AND (`database` NOT IN (
        SELECT `name`
        FROM `system`.`databases`
        WHERE `engine` IN ('MySQL', 'MaterializedMySQL', 'MaterializeMySQL', 'Lazy', 'PostgreSQL', 'MaterializedPostgreSQL', 'SQLite')
    ))
  2. 登录目标集群,通过remote函数执行数据迁移

手动迁移

从自建ClickHouse向企业版迁移

image.png

说明

云数据库 ClickHouse 企业版中,无论您的源表是否存在分片或副本,您只需创建对应的目标表即可(在该表中,您可以省略Engine参数,因为系统将自动使用SharedMergeTree表引擎)。云数据库 ClickHouse 企业版集群会自动处理垂直和水平扩展,您无需担心复制和分片的具体实现方式。

操作概述

从自建ClickHouse向云数据库 ClickHouse 企业版集群迁移的流程如下。

  1. 在源集群中添加一个只读用户。

  2. 在目标集群上复制源表结构。

  3. 如果源集群支持从外部网络访问时,您可以将源集群数据读取至目标集群;如果源集群不支持从外部网络访问时,您可以将源集群数据推送至目标集群。

  4. (可选)在目标集群上将源集群的IP地址删除。

  5. 从源集群中删除只读用户。

操作步骤

  1. 在源集群上执行以下操作(源表中已有数据):

    1. 增加一个只读用户到表db.table中。

      CREATE USER exporter
      IDENTIFIED WITH SHA256_PASSWORD BY 'password-here'
      SETTINGS readonly = 1;
      GRANT SELECT ON db.table TO exporter;
    2. 复制源表结构。

      SELECT create_table_query
      FROM system.tables
      WHERE database = 'db' and table = 'table'
  2. 在目标集群上执行以下操作。

    1. 创建数据库。

      CREATE DATABASE db
    2. 使用源数据表的CREATE TABLE语句来创建目标数据表。

      说明

      在运行CREATE TABLE语句时,将ENGINE更改为SharedMergeTree,但是不能包含任何参数,因为云数据库 ClickHouse 企业版集群始终会复制表并提供正确的参数。ORDER BYPRIMARY KEYPARTITION BYSAMPLE BYTTLSETTINGS子句定义了表的结构和元数据信息,请保留这些子句,以确保表在目标云数据库 ClickHouse 企业版集群中正确地创建。

      CREATE TABLE db.table ...
    3. 使用Remote函数读取数据或推送数据。

      说明

      如果源ClickHouse服务器不可从外部网络访问,您可以选择将数据推送而不是读取,因为Remote函数适用于选择和插入操作。

      • 在目标集群中使用Remote函数从源集群的源表中读取数据。

        image.png

        INSERT INTO db.table SELECT * FROM
        remote('source-hostname:9000', db, table, 'exporter', 'password-here')
      • 在源集群中使用Remote函数将数据推送到目标集群中。

        image.png

        说明

        为了使Remote函数能够连接到您的云数据库 ClickHouse 企业版集群上,您需要将源集群的IP地址添加到目标集群的白名单中。具体操作,请参见设置白名单

        INSERT INTO FUNCTION
        remote('target-hostname:9000', 'db.table',
        'default', 'PASS') SELECT * FROM db.table

常见问题

检查连通性与配置中的报错信息及解决方案

报错信息

含义

解决方案

Tcp connectivity check failed for '{host}:{port}':{error}.

自建集群网络连接超时。

根据报错信息,排查网络问题。

No such cluster: {cluster}, please run 'SELECT DISTINCT(cluster) FROM system.clusters;' to check

自建集群中不存在创建迁移任务时配置的cluster。

通过SQL查询自建集群的cluster,并修改迁移任务的配置。

not exists

自建集群不存在system.query_logsystem.partssystem.part_log中一个或多个系统表。

在自建集群创建对应的系统表。

Timezone mismatch with source, which may cause time data anomalies.

自建集群与目标集群时区不匹配。

修改时区,使其匹配。

Compatibility mismatch with source version, which may cause incompatibility.

目标集群compatibility配置与自建集群版本不一致。

调整目标集群compatibility配置,使其与自建集群版本一致。

重要

若将compatibility设置到低版本,会导致ParallelReplica等部分新特性失效。

检查库表结构中的报错信息及解决方案

报错信息

含义

解决方案

ERROR: Not consistent across nodes.

在自建集群中,不同节点之间的数据库表不一致。

检查自建集群各节点上的库表,解决不一致问题。

ERROR: Cannot get secrets (shown as [HIDDEN]), please set display_secrets_in_show_and_select=1 (restart required).

库表密码不可见。

设置display_secrets_in_show_and_select=1,并重启。

注意:此操作要求账号拥有displaySecretsInShowAndSelect权限。

ERROR: Unsupported engine.

自建集群的库引擎不支持迁移。

考虑更换目的端支持的库引擎。

WARN:Unsupported engine, it will be automatically replaced with a Replicated database to bypass migration exceptions.

自建集群的库引擎不支持迁移。

后台自动替换为Replicated数据库,以绕过迁移异常。

WARN:Unsupported engine, please replace the data synchronization capability with DTS, or create a same-name database to bypass migration exceptions.

自建集群的库引擎不支持迁移。

请使用DTS(数据传输服务)替代同步功能,或创建同名数据库以绕过迁移异常。

WARN:Unsupported engine, it will be automatically ignored during migration.

自建集群的库引擎不支持迁移。

在迁移过程中自动被忽略。

WARN:It's not recommended to use the Distributed engine as it will cause scaling issues in enterprise instances. Please drop this table and query the underlying MergeTree table directly。

云数据库 ClickHouse 企业版不建议使用分布式表。

在自建集群删除分布式表,迁移后直接查询MergeTree表。

WARN:Please confirm referenced IP addresses are accessible.

引用外部引擎,可能存在无法访问的问题,但并不一定存在问题。

需要您自行确认所引用的IP地址在目标实例是否可以访问。若无法访问,则需要打通网络连接,并加白IP地址。

WARN:Only structure, does not support data migration.

部分引擎的表只会迁移表结构,不支持迁移数据。

需要您通过remote函数等方式自行迁移数据

WARN:Unsupported engine, please create a same-name MergeTree table manually to bypass migration exceptions.

部分引擎的表不支持迁移。

需要客户在目标端创建同名的MergeTree表,并自行迁移数据。

WARN:Ignored engine, please create table manually.

部分引擎的表不支持迁移。

请参见操作步骤中的步骤四。

ERROR: Table has data in destination cluster.

检查库表结构时,对应的表在目标实例应为空表,不能有数据。

删除目标实例对应表的数据。

ERROR: Unsupported function origin.

只支持迁移客户自定义的Function(function.origin="SQLUserDefined")

自行在目标实例中创建对应的function。

其他

迁移过程中的其他问题及解决方法请参见常见问题