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

更新时间:
复制为 MD 格式

本文介绍如何通过控制台或手动迁移方式将自建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_logsystem.query_log,对config.xml文件进行修改配置,以实现增量迁移。

未启用system.part_logsystem.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_logsystem.query_log

  1. 您需根据下述内容,检查config.xmlsystem.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地址

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

    您可以使用以下SQL获取自建集群的IPPORT:

    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的一个副本组成。

    重要
    • 不能使用ClickHouseVPC域名地址或者SLB地址。

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

    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. 检查库表结构。

    检查连通性和配置成功后,进入检查库表结构步骤。此步骤分为选择需要迁移的库选择需要迁移的表检查库表结构三个子步骤。

    重要

    其中选择需要迁移的库选择需要迁移的表两个步骤可以跳过。若您确认需要迁移源端的所有库表,则不需要进行这两个子步骤,可以直接跳到子步骤3(检查库表结构)。

    子步骤1:选择需要迁移的库(可跳过)

    1. 单击查询源端,后台会自动查询源端的库。

    2. 查询过程中,您可以点击查询结果,来查看实时查询结果。

    3. 当源端库查询完毕后,您可以根据业务需求选择需要迁移的库,选择完毕后,点击确认提交即可。

    子步骤2:选择需要迁移的表(可跳过)

    1. 选择完需要迁移的库后,会进入选择需要迁移的表的界面,单击查询源端,后台会自动查询您选择的库中的所有表。

    2. 查询过程中,您可以点击查询结果,来查看实时查询结果。

    3. 当源端表查询完毕后,您可以根据业务需求选择需要迁移的表,选择完毕后,点击确认提交即可。

    重要

    选择需要迁移的表时,系统默认全选,若您只需要迁移部分表,可以取消对应库的全选框,打开下拉框后即可选择您需要的表。

    子步骤3:检查库表结构

    1. 单击开始检查,后台会进行库结构检查表结构检查UDF检查,此步骤主要检查源端实例的库、表、UDF是否存在与目的端不兼容的情况。

    2. 检测过程中,您可以选择通过结果级别检查项,并点击刷新按钮,来查看实时检查结果。

    3. 检测结果分为成功、警告、失败三类。

      • 检测成功:可直接单击下一步,进行后续迁移流程。

      • 检测过程出现告警

        您可以将结果级别设置为警告,并找到对应检查项查看对应的警告原因。

        重要

        结果级别为警告的检查项非强制卡点项,需要您自行确认该警告项是否会对您的业务和迁移任务造成影响,在您自行确认后,有以下两种选择

        • 忽略告警,直接单击下一步,进行后续的迁移流程。

        • 根据告警内容处理对应的告警项后,单击开始检查,重新检查库表结构。检测告警信息以及解决方案,请参见本文检查库表结构中的报错信息及解决方案

      • 检测失败

        您可以将结果级别设置为错误,并找到对应检查项查看对应的错误原因。

        重要

        结果级别为错误的检查项为强制卡点项,您需要根据错误内容处理对应的错误项后,单击开始检查,重新检查库表结构。检测报错信息以及解决方案,请参见本文检查库表结构中的报错信息及解决方案

  8. 库表结构迁移。

    1. 单击开始迁移

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

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

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

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

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

    • 无需执行,则单击跳过

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

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

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

  10. 记录并清理 Kafka/RabbitMQ 引擎表。

    启动同步前,需要在自建集群中记录 Kafka/RabbitMQ 引擎表及其下游物化视图的定义,处理隐式表后删除这些表,以避免迁移异常。

    1. 登录自建集群,查询所有 Kafka 和 RabbitMQ 引擎表及其下游依赖关系。

      /*
      create_table_query:表定义
      dependencies_database:依赖此表的库
      dependencies_table:依赖此表的表
      从 dependencies_database 和 dependencies_table 可以拿到依赖 Kafka/RabbitMQ 表的物化视图表
      */
      SELECT * FROM system.tables WHERE engine IN ('RabbitMQ', 'Kafka');
    2. 查看物化视图定义,确认其目标表是否为隐式表。

      /*
      查看物化视图定义
      如果物化视图的目标表是隐式表,则特别注意:删除物化视图表会同步删除隐式表,导致数据丢失
      举例:CREATE MATERIALIZED VIEW [db.]table_name [TO[db.]name] 中没有指定 TO,
      则系统会自动创建出来一个隐式表,可能格式为 '.inner_id.<TABLE_UUID>' 或 '.inner.<TABLE>'
      */
      SELECT * FROM system.tables WHERE database='<DATABASE>' AND name = '<MATERIALIZED_VIEW_NAME>';
    3. 如果物化视图目标表是隐式表,则 RENAME 物化视图目标表到一个新名字,避免后续删除物化视图时同步删除目标表导致数据丢失。

      -- 将隐式目标表 rename 到新名字,保护数据
      RENAME TABLE <DATABASE>.`.inner_id.<TABLE_UUID>` TO <DATABASE>.<new_target_table_name>;
    4. 删除 Kafka/RabbitMQ 引擎表及其下游物化视图。

      -- 先删除物化视图
      DROP TABLE <DATABASE>.<MATERIALIZED_VIEW_NAME>;
      -- 再删除 Kafka/RabbitMQ 引擎表
      DROP TABLE <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME>;
    重要

    请务必保存好所有记录的建表语句(DDL)。后续需要在自建集群和目标集群上重建这些表。如果执行了 RENAME 操作,重建物化视图时需要指向已被 RENAME 的目标表。

  11. 启动同步。

    1. 单击开始同步

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

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

      操作

      功能含义

      影响

      使用场景

      停止

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

      • 数据可能未完全迁移。

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

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

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

      重启

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

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

      取消迁移

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

      重要

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

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

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

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

    3. 自建集群上,使用之前保存的 DDL 语句重建 Kafka/RabbitMQ 引擎表及其下游物化视图。重建后增量数据将恢复流入并自动同步到目标集群。

      重要

      如果之前对隐式目标表执行了 RENAME 操作,重建物化视图时需要使用 TO 子句指向已被 RENAME 的目标表,具体请参见CREATE MATERIALIZED VIEW

      -- 在自建集群重建 Kafka/RabbitMQ 引擎表
      CREATE TABLE <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME> (...)
      ENGINE = Kafka/RabbitMQ
      SETTINGS ...;
      
      -- 重建物化视图(指向已 RENAME 的目标表)
      CREATE MATERIALIZED VIEW <DATABASE>.<MATERIALIZED_VIEW_NAME> TO <DATABASE>.<new_target_table_name>
      AS SELECT ... FROM <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME>;
    4. 当执行到迁移数据时,切换到迁移数据页签,单击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

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

      • 目前迁移最长时间阈值统一设置为5,当持续迁移时间满5时,后台将自动取消迁移任务,若您的迁移任务需要更长的迁移时间,请提交工单联系技术支持调整阈值。

      评估何时停写自建集群并执行切流

      当迁移预估时间少于 10 分钟或者迁移进度达到 99% 时,执行以下操作完成切流:

      1. 停止业务写入。在自建集群上,删除之前重建的 Kafka/RabbitMQ 引擎表及其下游物化视图。

        -- 先删除物化视图
        DROP TABLE <DATABASE>.<MATERIALIZED_VIEW_NAME>;
        -- 再删除 Kafka/RabbitMQ 引擎表
        DROP TABLE <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME>;
      2. 等待迁移进度达到 100%,迁移完全结束。

      3. 连接目标集群,使用之前保存的 DDL 语句重建 Kafka/RabbitMQ 引擎表及其下游物化视图。

        重要

        如果之前对隐式目标表执行了 RENAME 操作,重建物化视图时需要使用 TO 子句指向已被 RENAME 的目标表。参考 CREATE MATERIALIZED VIEW。

        -- 在目标集群重建 Kafka/RabbitMQ 引擎表
        CREATE TABLE <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME> (...)
        ENGINE = Kafka/RabbitMQ
        SETTINGS ...;
        
        -- 重建物化视图(指向已 RENAME 的目标表)
        CREATE MATERIALIZED VIEW <DATABASE>.<MATERIALIZED_VIEW_NAME> TO <DATABASE>.<new_target_table_name>
        AS SELECT ... FROM <DATABASE>.<KAFKA_OR_RABBITMQ_TABLE_NAME>;
      4. 验证目标集群数据管道正常工作,确认数据正常流入。

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

      image

    6. 同步完成后单击完成

      重要

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

步骤四:迁移非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。

其他

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