全部產品
Search
文件中心

ApsaraDB for ClickHouse:將自建ClickHouse資料移轉至雲ClickHouse社區相容版

更新時間:Jan 16, 2026

由於自建ClickHouse面臨高穩定性風險、營運管理難(叢集擴充性差、版本更新困難)以及容災能力弱等原因,越來越多的客戶希望將自建的ClickHouse叢集升級為雲PaaS服務。本文為您介紹,自建ClickHouse如何遷移至雲資料庫ClickHouse社區相容版叢集。

前提條件

  • 目的地組群:

    • 叢集為社區相容版叢集。

    • 已具有資料庫帳號和密碼。ClickHouse如何建立帳號,請參見社區相容版帳號管理

    • 帳號許可權需具備最高許可權。如何授權,請參見修改許可權

  • 自建叢集:

    • 已具有資料庫帳號和密碼。

    • 帳號許可權需具備庫表讀許可權、SYSTEM命令執行許可權。

  • 目的地組群與自建叢集網路互連。

    如果自建叢集和目的地組群位於同一個VPC下,您還需要將目的地組群所有節點的IP地址以及其交換器的IPv4網段,添加到自建叢集的白名單中。

    • 雲資料庫ClickHouse中如何添加白名單,請參見設定白名單

    • 自建叢集如何添加白名單,請參見自身產品文檔。

    • 如何查看雲資料庫ClickHouse叢集的所有節點的IP地址,請通過SELECT * FROM system.clusters;查看。

    • 如何擷取雲資料庫ClickHouse交換器的IPv4網段,請參見以下步驟:

      1. 雲資料庫ClickHouse控制台找到目的地組群的集群資訊頁面,在網路資訊處擷取交换机 ID

      2. 交換器列表,根據交換器的執行個體ID,搜尋找到目標交換器,查看IPv4網段

    當自建叢集和雲叢集位於不同VPC,或自建叢集位於本地IDC或其他雲廠商時,請先解決網路問題。具體操作,請參見如何解決目的地組群與資料來源網路互連問題?

遷移驗證

在您正式開始遷移資料前,強烈建議您建立一個測試環境,以驗證業務的相容性、效能以及遷移是否能夠順利完成。在遷移驗證完成後,再在生產環境中進行資料移轉。這一步驟至關重要,它可以協助您提前識別並解決潛在問題,確保遷移過程順利,並且避免對生產環境造成不必要的影響。

  1. 建立遷移任務,進行資料移轉。具體步驟,請參見本文。

  2. 上雲相容性和效能瓶頸分析以及是否能完成遷移,請參見ClickHouse自建上雲相容性和效能瓶頸分析與解決

選擇方案

遷移方案

優點

缺點

適用情境

控制台遷移

可視化操作,無需手動遷移中繼資料。

只能進行整叢集資料的全量和增量遷移,無法僅遷移指定的部分庫表或部分歷史資料。

整個叢集資料移轉。

手動遷移

可自主控制遷移哪些庫表資料。

操作繁雜,需要手動遷移中繼資料。

  • 部分庫表資料移轉。

  • 冷存資料超過1TB。

  • 熱資料超過10TB。

  • 無法滿足控制台遷移條件的整個叢集資料移轉。

操作步驟

控制台遷移

使用限制

目的地組群版本需大於等於21.8。

注意事項

遷移過程中

  • 目的地組群進行遷移的庫表會暫停合并(Merge),但自建叢集不會。

    說明

    遷移資料時間過長,將導致目的地組群的中繼資料積累過多。建議遷移任務的持續時間長度不超過5天。

  • 目的地組群必須使用default叢集。如果您自建叢集的命名使用了其他名字,則會自動將分布式表中的cluster定義轉化為default。

遷移內容

  • 支援遷移的內容:

    • 庫、資料字典、物化視圖。

      • 只支援遷移SQL建立的資料字典,不支援通過XML建立的資料字典。

        確認方法:SELECT * FROM system.dictionaries WHERE (database = '') OR isNull(database);,如果SQL存在返回結果,代表有XML建立的資料字典。

      • 資料字典訪問外部服務時,請確保外部服務可用且為叢集開放白名單;資料字典的資料來源為當前ClickHouse的內表資料時,如果定義中HOST參數配置的是IP地址,遷移後可能會因IP變更而導致訪問失敗,需重新確認當前ClickHouseHOST並手動建立資料字典。

    • 表結構:除了Kafka和RabbitMQ引擎表以外的所有表結構。

    • 資料:增量遷移MergeTree族表的資料。

  • 不支援遷移的內容:

    • Kafka和RabbitMQ引擎表的表以及資料。

    • 非MergeTree類型表(例如外表、Log表等)的資料。

    重要

    以上不支援的內容,在遷移過程中,您需根據操作步驟,手動處理。

  • 遷移資料量:

    • 冷資料:冷存資料的遷移速度相對較慢,建議您盡量清理自建叢集中的冷存資料,以確保其總量不超過1TB。否則,遷移時間過長可能會導致遷移失敗。

    • 熱資料:熱資料如果超過10TB,遷移任務失敗率比較高,不建議您使用此方案進行遷移。

    如果資料不滿足上述條件,遷移方案可選擇手動遷移

叢集影響

  • 自建叢集:

    • 讀取自建叢集過程中,自建叢集的CPU和記憶體會升高。

    • 不允許其進行DDL操作。

  • 目的地組群:

    • 寫入資料過程中,目的地組群的CPU和記憶體升高。

    • 不允許進行DDL操作。

    • 遷移的庫表不允許進行DDL操作,不需要遷移的庫表沒有此限制。

    • 遷移中的庫錶停止merge,不需要遷移的庫表不會停止merge。

    • 遷移任務開始前會重啟。

    • 遷移結束後,叢集會持續一段時間高頻merge操作,這會導致IO使用率上升,從而引起業務請求的延遲增加。建議您提前規劃以應對業務請求延遲的潛在影響。具體merge操作時間,您需自己計算。如何計算,請參見計算遷移結束後的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

步驟二:配置目的地組群相容自建叢集版本

配置目的地組群相容自建叢集,盡量減少上雲後,業務上的修改。

  1. 擷取目的地組群與自建叢集的版本號碼並對比二者是否相同。

    登入目的地組群與自建叢集,分別執行下述語句,擷取二者的版本號碼。如何登入雲資料庫ClickHouse,請參見串連資料庫

    SELECT version();
  2. 如果對比結果不同,您需登入目的地組群,通過修改compatibility參數與自建叢集的版本號碼保持一致。使二者功能儘可能保持一致。樣本如下。

    SET GLOBAL compatibility = '22.8';

步驟三:(可選)目的地組群開啟使用MaterializedMySQL引擎。

如果自建叢集中有引擎為MaterializedMySQL的表,您需執行下述語句,開啟MaterializedMySQL引擎的使用。

SET GLOBAL allow_experimental_database_materialized_mysql = 1;
說明

ClickHouse社區已不再維護MaterializedMySQL引擎,建議您上雲後,使用DTS同步MySQL資料。

針對MaterializedMySQL引擎社區不再維護問題,DTS將MySQL資料同步至雲資料庫ClickHouse時,其使用ReplacingMergeTree表代替了MaterializedMySQL表。更多詳情,請參見MaterializedMySQL相容性

如何使用DTS遷移MySQL資料至雲資料庫ClickHouse,請參見下述文檔。

步驟四:建立遷移任務

  1. 登入雲資料庫ClickHouse控制台

  2. 集群清單頁面,選擇默認實例列表,單擊目的地組群ID。

  3. 在左側導覽列,單擊数据迁移及同步 > 實例遷移

  4. 在遷移任務頁面,單擊創建遷移任務

    1. 配置源執行個體與目標執行個體。

      配置以下資訊,單擊測試連接以進行下一步

      說明

      測試連接成功後,進入下一個步驟。如果測試連接失敗,請根據提示,重新設定源執行個體和目標執行個體。

      image

      源叢集配置項

      配置項

      說明

      樣本

      源端接入方式

      固定選擇专线/VPN网关/智能网关/ECS自建ClickHouse

      专线/VPN网关/智能网关/ECS自建ClickHouse

      集群名稱

      源叢集的名稱。

      僅由阿拉伯數字和小寫英文字母組成。

      source

      源实例cluster名称

      您需通過SELECT * FROM system.clusters;擷取源实例cluster名称

      default

      VPC IP地址

      叢集每個shard的IP和PORT(即shard的TCP地址),並使用英文逗號隔開。

      重要

      不能使用雲ClickHouse的VPC網域名稱地址或者SLB地址。

      格式:IP:PORT,IP:PORT,......

      根據自建上雲的使用情境不同,叢集IP和PORT的擷取方法不同。

      阿里雲ClickHouse執行個體的跨賬戶、跨地區遷移

      您可以使用以下SQL擷取自建叢集的IP和PORT。

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

      其中replica_num=1表示選擇第一個複本集,您也可以選擇其他複本集或者自行挑選每個shard的一個副本組成。

      非阿里雲ClickHouse執行個體遷移

      如果IP不便映射到阿里雲,您可以使用以下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一個副本組成。

      如果IP和連接埠發生了轉換後映射到阿里雲,則需要根據網路打通情況配置對應的IP和PORT。

      192.168.0.5:9000,192.168.0.6:9000

      數據庫賬號

      源叢集資料庫帳號。

      test

      數據庫密碼

      源叢集資料庫帳號密碼。

      test******

      目的地組群配置項

      配置項

      說明

      樣本

      數據庫賬號

      目的地組群資料庫帳號。

      test

      數據庫密碼

      目標群資料庫帳號密碼。

      test******

    2. 確認遷移內容。

      仔細閱讀頁面中資料移轉的包含內容提示資訊,單擊下一步:預檢測並啟動同步

    3. 後台遷移鏈路預檢測並啟動任務。

      後台會對目的地組群和自建叢集進行實例狀態檢測存儲空間檢測本地表和分布式錶檢測

      • 檢測成功:

        檢測成功後的介面如下圖所示。

        image

        1. 仔細閱讀頁面遷移過程中對執行個體的影響提示內容。

        2. 單擊完成

          重要
          • 單擊完成後,任務建立完成且啟動,任務狀態為運行中,您可在工作清單查看任務。

          • 完成任務建立後,您還需監控遷移任務,在遷移完成的最後階段,主動停寫自建叢集,進行剩餘庫表結構遷移。如何監控遷移任務,請參見監控遷移任務並停寫自建叢集

      • 檢測失敗:您需要按照提示資訊進行操作,重新進行資料移轉。檢測內容及要求如下。檢測報錯資訊以及解決方案,請參見遷移檢查中報錯資訊查詢及解決方案

        檢測專案

        檢測要求

        實例狀態檢測

        遷移發起時,自建叢集和目的地組群不能有正在啟動並執行管控任務(包含擴容,升降配等)。如果當前自建叢集和目的地組群有管控任務正在運行,則不能發起遷移任務。

        存儲空間檢測

        遷移進行前,進行儲存空間校正。保證目的地組群的儲存空間大於等於自建叢集的已使用空間的1.2倍。

        本地表和分布式錶檢測

        如果自建叢集存在本地表沒有建立分布式表或者分布式表不唯一,則校正失敗。請刪除多餘的分布式表或建立唯一分布式表。

步驟五:評估遷移是否可以完成

如果源叢集的寫入速度小於 20MB/s,您可跳過此步驟。

如果源叢集的寫入速度大於 20MB/s,由於目的地組群理論上單節點寫入速度也大於 20MB/s。為了確保目的地組群的寫入速度能夠趕上源叢集的寫入速度,從而順利完成遷移,您需要檢查目的地組群的真實寫入速度,以評估遷移的可行性。具體操作如下:

  1. 查看目的地組群的磁碟吞吐,以判斷目的地組群的真實寫入速度,如何查看磁碟吞吐,請參見查看叢集監控資訊

  2. 判斷目的地組群與源叢集的寫入速度的關係。

    1. 目的地組群寫入速度大於源叢集的寫入速度:遷移成功率較高,繼續步驟六操作。

    2. 目的地組群寫入速度小於源叢集的寫入速度:遷移失敗率較高,建議您取消遷移任務,使用手動遷移進行資料移轉。

步驟六:監控遷移任務並預估何時停寫自建叢集

  1. 登入雲資料庫ClickHouse控制台

  2. 在社區版執行個體列表,單擊目的地組群ID。

  3. 在左側導覽列,單擊数据迁移及同步 > 實例遷移

  4. 在執行個體遷移列表頁面,您可進行以下操作:

    • 查看遷移任務的狀態以及運行階段資訊。

      重要

      您需重點監控目標任務的运行阶段信息,根據运行阶段信息列中預計剩餘時間,按照步驟七,主動停寫自建叢集並處理Kafka和RabbitMQ引擎表。

    • 單擊操作列的查看详情進入任務詳情頁面,查看任務詳情。任務詳情包含以下內容。

      說明

      如果遷移任務結束,即狀態為已完成、已取消,則控制台上查看詳情中的內容會被清空,您可在目的地組群通過以下SQL查看遷移的表結構列表。

      SELECT `database`, `name`, `engine_full` FROM `system`.`tables` WHERE `database` NOT IN ('system', 'INFORMATION_SCHEMA', 'information_schema');
      • 所有已遷移的表結構以及其是否遷移成功的狀態。

      • 所有遷移了的資料庫結構及其是否遷移成功的狀態。

      • 所有庫表遷移失敗的報錯資訊。

    遷移任務的各個狀態及其對應的功能如下。

    任務狀態

    功能描述

    運行中

    準備遷移的環境和資源中。

    初始化

    初始化遷移任務中。

    配置遷移

    遷移叢集的配置。

    庫表結構遷移

    遷移所有庫,以及MergeTree族表和Distributed表。

    資料移轉

    增量遷移MergeTree族表的資料。

    其他庫表結構遷移

    遷移物化視圖和非MergeTree族表的表結構。

    檢查資料

    檢查目的地組群已完成的表資料量和自建叢集的表資料量是否一致,如果不一致,任務可能無法完成,建議重新進行遷移。

    後置配置

    遷移完成後的目的地組群的系統配置,例如清理遷移現場、開啟源執行個體寫入等。

    已完成

    遷移任務已完成。

    已取消

    遷移任務已取消。

步驟七:停寫自建叢集並處理Kafka和RabbitMQ引擎表

業務切流前需要確保自建執行個體無新資料產生,進而保證遷移後資料的完整性。故需停止業務寫入,並刪除Kafka和RabbitMQ表。具體操作如下:

  1. 登入自建叢集,通過以下語句,查詢需要處理的表。

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

    SHOW CREATE TABLE <aim_table_name>;
  3. 登入目的地組群,執行上一步擷取的建表語句。如何登入目的地組群,請參見通過DMS串連ClickHouse

  4. 登入自建叢集,刪除已經遷移了的Kafka和RabbitMQ引擎表。

    重要

    刪除Kafka時,需同時刪除引用Kafka表的物化視圖,否則會導致物化視圖遷移無法完成,最終導致遷移無法完成。

步驟八:完成遷移任務

完成任務操作代表在您主動停寫自建叢集後,此任務完成剩餘資料移轉,並進行資料量檢查,遷移剩餘的庫表結構。已完成遷移的內容,您可通過查看任務詳情擷取。

重要
  • 如果檢查不通過,遷移任務會一直處於資料量檢查階段。建議您取消遷移,重新建立遷移任務。如何取消遷移任務,請參見其他動作

  • 長時間的遷移資料會導致目的地組群的中繼資料過多,進而會影響遷移的速度。建議您在遷移任務建立後的5天內完成此操作。

  1. 登入雲資料庫ClickHouse控制台

  2. 集群清單頁面,選擇默認實例列表,單擊目的地組群ID。

  3. 在左側導覽列,單擊数据迁移及同步 > 實例遷移

  4. 在目標遷移任務的操作列,單擊完成迁移

  5. 完成迁移對話方塊,單擊確定

步驟九:遷移非MergeTree類型表的業務資料

遷移任務中,非MergeTree類型的表(例如外表、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函數進行遷移表資料。具體操作,請參見通過remote函數進行資料移轉

其他動作

遷移任務完成相關操作後,任務的遷移狀態會變成已完成,但務列表不會立即更新,建議您,通過間隔重新整理查看任務狀態。

操作

功能含義

影響

使用情境

取消遷移

強製取消任務,跳過資料量檢查,不遷移剩餘的庫表結構。

  • 遷移任務強制終止,目標執行個體庫表結構和配置可能不完整,不可作為業務正常使用。

  • 在您重新發起遷移之前,必須先清理目的地組群中已遷移的資料,避免出現資料重複的情況。

遷移任務影響了自建叢集,希望儘快結束遷移,開啟寫入。

停止遷移

立刻停止遷移資料,跳過資料量檢查,遷移剩餘的庫表結構。

無。

期望遷移一部分資料後測試,但是不想停寫自建叢集。

停止遷移

  1. 登入雲資料庫ClickHouse控制台

  2. 集群清單頁面,選擇默認實例列表,單擊目的地組群ID。

  3. 在左側導覽列,單擊数据迁移及同步 > 實例遷移

  4. 在目標遷移任務的操作列,單擊停止迁移

  5. 停止迁移對話方塊,單擊確定

取消遷移

  1. 登入雲資料庫ClickHouse控制台

  2. 集群清單頁面,選擇默認實例列表,單擊目的地組群ID。

  3. 在左側導覽列,單擊数据迁移及同步 > 實例遷移

  4. 在目標遷移任務的操作列,單擊取消迁移

  5. 取消迁移對話方塊,單擊確定

手動遷移

方法一:使用BACKUPRESTORE命令遷移

具體操作,請參見使用BACKUP和RESTORE命令實現資料備份恢複

方法二:使用 INSERT FROM SELECT語句遷移

步驟一:中繼資料(建表的DDL)的遷移

ClickHouse中繼資料的遷移,主要指進行建表DDL遷移。

如需安裝clickhouse-client工具,請安裝與目標執行個體雲資料庫ClickHouse版本一致的clickhouse-client工具。下載連結,請參見clickhouse-client

  1. 查看自建叢集的database列表。

    clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SHOW databases"  > database.list

    參數說明:

    參數

    描述

    old host

    自建叢集的地址。

    old port

    自建叢集的連接埠。

    old user name

    登入自建叢集的帳號,擁有DML讀寫和設定許可權,允許DDL許可權。

    old password

    上述帳號對應的密碼。

    說明

    system是系統資料庫,不需要遷移,可以直接過濾掉。

  2. 查看自建叢集的table列表。

    clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SHOW tables from <database_name>"  > table.list

    參數說明:

    參數

    描述

    database_name

    資料庫名稱

    您也可以通過系統資料表直接查詢所有database和table名稱。

    SELECT DISTINCT database, name FROM system.tables WHERE database != 'system';
    說明

    查詢到的表名中,如果有以.inner.開頭的表,則它們是物化視圖的內部表示,不需要遷移,可以直接過濾掉。

  3. 匯出自建叢集中指定資料庫下所有表的建表DDL。

    clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>" --query="SELECT concat(create_table_query, ';') FROM system.tables WHERE database='<database_name>' FORMAT TabSeparatedRaw" > tables.sql
  4. 將建表DDL匯入到目標執行個體雲資料庫ClickHouse。

    說明

    您需要在建表DDL匯入之前,在雲資料庫ClickHouse中建立表所在資料庫。

    clickhouse-client --host="<new host>" --port="<new port>" --user="<new user name>" --password="<new password>"  -d '<database_name>'  --multiquery < tables.sql

    參數說明:

    參數

    描述

    new host

    目標執行個體雲資料庫ClickHouse的地址。

    new port

    目標執行個體雲資料庫ClickHouse的連接埠。

    new user name

    登入目標執行個體雲資料庫ClickHouse的帳號,擁有DML讀寫和設定許可權,允許DDL許可權。

    new password

    上述帳號對應的密碼。

步驟二:資料移轉

通過remote函數進行資料移轉

  1. (可選)在進行雲資料庫ClickHouse資料移轉時,如果需要考慮網路流量。您可以通過調整network_compression_method參數來選擇合適的壓縮演算法,減少流量的使用。

    • 在目標執行個體雲資料庫ClickHouse中臨時修改或查看network_compression_method,樣本如下。

    • SET network_compression_method = 'ZSTD';
    • 在目標執行個體雲資料庫ClickHouse中查看network_compression_method參數值,樣本如下。

    • SELECT * FROM system.settings WHERE name = 'network_compression_method';
  2. 在目標執行個體雲資料庫ClickHouse中,通過如下SQL進行資料移轉。

    INSERT INTO <new_database>.<new_table> 
    SELECT * 
    FROM remote('<old_endpoint>', <old_database>.<old_table>, '<username>', '<password>') 
    [WHERE _partition_id = '<partition_id>']
    SETTINGS max_execution_time = 0, max_bytes_to_read = 0, log_query_threads = 0, max_result_rows = 0;
    說明

    20.8版本優先使用remoteRaw函數進行資料移轉,如果失敗可以申請小版本升級。

    INSERT INTO <new_database>.<new_table> 
    SELECT * 
    FROM remoteRaw('<old_endpoint>', <old_database>.<old_table>, '<username>', '<password>')
    [WHERE _partition_id = '<partition_id>']
    SETTINGS max_execution_time = 0, max_bytes_to_read = 0, log_query_threads = 0, max_result_rows = 0;

    參數說明:

    重要

    通過partition_id對資料過濾後,可以減少資源佔用,建議您選用此參數。

    (可選)如果您不知道如何擷取partition_id及part的數量,可以通過以下SQL在system.parts系統中查詢。

    SELECT partition_id, count(*) AS part_count from clusterAllReplicas(default, system, parts) WHERE `database` = '<old_database>' AND `table` = '<old_table>' GROUP BY partition_id ;

    參數

    描述

    new_database

    目標雲資料庫ClickHouse執行個體中的資料庫名。

    new_table

    目標執行個體雲資料庫ClickHouse中的表名。

    old_endpoint

    源執行個體的endpoint。

    自建ClickHouse

    endpoint格式:源執行個體節點的IP:port

    重要

    此處port為TCP port。

    雲資料庫ClickHouse

    源執行個體的endpoint為VPC內網endpoint,不是公網endpoint。

    重要

    以下連接埠3306和9000是固定值。

    • 社區版執行個體:

      • endpoint格式:VPC內網地址:3306

      • 樣本:cc-2zeqhh5v7y6q*****.clickhouse.ads.aliyuncs.com:3306

    • 企業版執行個體:

      • endpoint格式:VPC內網地址:9000

      • 樣本:cc-bp1anv7jo84ta*****clickhouse.clickhouseserver.rds.aliyuncs.com:9000

    old_database

    自建叢集的資料庫名。

    old_table

    自建叢集的表名。

    username

    自建叢集的帳號。

    password

    自建叢集的密碼。

    max_execution_time

    查詢的最大執行時間。設定為0表示沒有時間限制。

    max_bytes_to_read

    查詢在讀取來源資料時能讀取的最大位元組數。設定為0表示沒有限制。

    log_query_threads

    是否記錄查詢執行的線程資訊。設定為0表示不記錄線程資訊。

    max_result_rows

    查詢結果的最大行數。設定為0表示沒有限制。

    _partition_id

    資料分區ID。

通過檔案匯出匯入方式進行資料移轉

通過檔案,將資料從自建叢集資料庫匯出到目標執行個體雲資料庫ClickHouse中。

  • 通過CSV檔案匯出匯入
    1. 將資料從自建叢集資料庫匯出為CSV格式檔案。

      clickhouse-client --host="<old host>" --port="<old port>" --user="<old user name>" --password="<old password>"  --query="select * from <database_name>.<table_name> FORMAT CSV"  > table.csv
    2. 匯入CSV檔案到目標執行個體雲資料庫ClickHouse。

      clickhouse-client --host="<new host>" --port="<new port>" --user="<new user name>" --password="<new password>"  --query="insert into <database_name>.<table_name> FORMAT CSV"  < table.csv
  • 通過Linux pipe管道進行流式匯出匯入
    clickhouse-client --host="<old host>" --port="<old port>" --user="<user name>" --password="<password>"  --query="select * from <database_name>.<table_name> FORMAT CSV" | 
    clickhouse-client --host="<new host>" --port="<new port>" --user="<user name>" --password="<password>"   --query="INSERT INTO <database_name>.<table_name> FORMAT CSV"

遷移檢查中報錯資訊查詢及解決方案

檢查報錯資訊

含義

解決方案

Missing unique distributed table or sharding_key not set.

自建叢集的本地表缺失唯一分布式表。

遷移前,自建叢集的本地表需要建立對應的分布式表。

The corresponding distribution table is not unique.

自建叢集的本地表對應的分布式表存在多個。

自建叢集刪除多餘的分布式表,保留其中一個。

MergeTree table on multiple replica cluster.

自建叢集為多複本集群,但是存在非Replicated表,資料在副本之間不一致,不支援遷移。

擴縮容和遷移多副本執行個體時,為什麼不允許存在非Replicated表?

Data reserved table on destination cluster.

需要遷移的表在目的地組群存在資料。

刪除目的地組群對應的表。

Columns of distributed table and local table conflict

自建叢集的分布式表和本地表的列不一致。

自建叢集重建分布式表,和本地表保持一致。

Storage is not enough.

目的地組群儲存空間不足。

升配目的地組群磁碟空間,滿足目的地組群總空間大於1.2倍的自建叢集使用空間。如何升配,請參見社區相容版叢集垂直變更配置和水平擴縮容

Missing system table.

自建叢集系統資料表缺失。

修改自建叢集配置config.xml,建立必須的系統資料表。如何配置,請參見步驟一:自建叢集檢查並開啟使用系統資料表system。

The table is incomplete across different nodes.

該表在部分節點缺失。

需要在不同分區建立同名的表。針對物化視圖inner表,建議重新命名inner表,然後重建物化視圖,指向重新命名後的inner表。具體操作,請參見物化視圖inner表在不同分區不一致

計算遷移結束後的merge時間

遷移結束後,目的地組群會持續一段時間的高頻merge操作,這會導致IO使用率上升,從而引起業務請求的延遲增加。如果您的業務對讀寫資料延遲敏感,建議您升配執行個體規格和磁碟PL等級,縮短merge引發IO使用率高的時間。如何升配,請參見社區相容版叢集垂直變更配置和水平擴縮容

遷移結束後的merge時間具體計算公式如下:

說明

單副本和雙複本集群都可使用以下公式計算。

  • 預計高頻merge操作總時間 = MAX(熱存資料merge時間,冷存資料merge時間)

    • 熱存資料merge時間 = 單節點熱資料量 * 2 / MIN(執行個體規格頻寬, 磁碟頻寬*n)

    • 冷存資料merge時間 = (冷資料量/節點數) / MIN(執行個體規格頻寬, OSS讀頻寬) + (冷資料量/節點數) / MIN(執行個體規格頻寬, OSS寫頻寬)

參數說明如下。

  • 單節點熱資料量:您可通過查看叢集監控資訊查看磁碟使用量-單節點統計行的資料。

  • 執行個體規格頻寬

    說明

    執行個體規格頻寬資料並非絕對。如果雲資料庫ClickHouse後台使用了不同的機型,該參數將會有所不同。此處的資料為最低頻寬,以供參考。

    規格

    頻寬 (MB/s)

    標準型8核32GB

    250

    標準型16核64GB

    375

    標準型24核96GB

    500

    標準型32核128GB

    625

    標準型64核256GB

    1250

    標準型80核384GB

    2000

    標準型104核384GB

    2000

  • 磁碟頻寬:請參見ESSD雲端硬碟效能層級表格中單盤最大輸送量(MB/s)行的資料

  • n:表示單節點磁碟數量,您可通過SELECT count() FROM system.disks WHERE type = 'local';擷取。

  • 冷資料量:您可通過查看叢集監控資訊查看冷存使用量行的資料。

  • 節點數:叢集的節點數量,您可通過SELECT count() FROM system.clusters WHERE cluster = 'default' and replica_num=1;擷取。

  • OSS讀頻寬:請參見OSS頻寬表格中內外網總下載頻寬列的資料

  • OSS寫頻寬:請參見OSS頻寬表格中內外網總上傳頻寬列的資料

常見問題

  • Q:如何處理報錯:“Too many partitions for single INSERT block (more than 100)”?

    A:單個INSERT操作中超過了max_partitions_per_insert_block(最大分區插入塊,預設值為100)。ClickHouse每次寫入都會產生一個data part(資料部分),一個分區可能包含一個或多個data part,如果單個INSERT操作中插入了太多分區的資料,那會造成ClickHouse內部有大量的data part,這會給合并和查詢造成很大的負擔。為了防止出現大量的data part,ClickHouse內部做了限制。

    解決方案:請執行以下操作,調整分區數或者max_partitions_per_insert_block參數。

    • 調整表結構,調整分區方式,或避免單次插入的不同分區數超過限制。

    • 避免單次插入的不同分區數超過限制,可根據資料量適當修改max_partitions_per_insert_block參數,放大單個插入的不同分區數限制,修改文法如下:

      SET GLOBAL ON cluster DEFAULT max_partitions_per_insert_block = XXX;
      說明

      ClickHouse社區推薦預設值為100,分區數不要設定得過大,否則可能對效能產生影響。在大量匯入資料後可以將值修改為預設值。

  • Q:為什麼目標執行個體雲資料庫ClickHouse串連自建資料庫ClickHouse串連失敗?

    A:可能是您的自建資料庫ClickHouse設定了防火牆或白名單等操作。您需在自建資料庫ClickHouse的白名單中添加雲資料庫ClickHouse的交換器的IPv4網段。如何擷取雲資料庫ClickHouse的交換器的IPv4網段,請參見查看IPv4網段

  • Q:擴縮容和遷移多副本執行個體時,為什麼不允許存在非Replicated表?如果存在,如何解決?

    A:原因及解決方案如下:

    • 原因分析:多副本執行個體需要使用Replicated表才能實現資料在副本間同步,否則多副本將失去意義。遷移工具隨機播放其中一個副本作為資料來源將資料移轉到目標執行個體。

      如果存在非Replicated表,導致不同副本之間資料無法同步,資料處於單副本狀態。遷移工具只會遷移其中一個副本的資料,進而導致資料缺失。如下圖所示,副本0(r0)的MergeTree表存在1、2、3資料;副本1(r1)的MergeTree表存在4、5資料。遷移到目標執行個體後,只剩下1、2、3資料。

      image
    • 解決方案:如果源執行個體非Replicated表可以刪除,建議優先選擇刪除表。否則,需要將源執行個體的非Replicated表替換為Replicated表。具體操作如下:

      1. 登入源執行個體。

      2. 建立Replicated表,除了引擎以外,表結構必須與要替換的非Replicated表保持一致。

      3. 手動將非Replicated表的資料移轉到建立的Replicated表。遷移語句如下。

        重要

        每個副本都需遷移,即r0和r1都需要執行。

        語句中節點IP可通過SELECT * FROM system.clusters;擷取。

        INSERT INTO <目標庫>.<建立的Replicated表> 
        SELECT * 
        FROM remote('<節點IP>:3003', '<源庫>', '<要替換的非Replicated表>', '<username>', '<password>')
        [WHERE _partition_id = '<partition_id>']
        SETTINGS max_execution_time = 0, max_bytes_to_read = 0, log_query_threads = 0;
      4. 將非Replicated表和Replicated表互換名字

      EXCHANGE TABLES <源庫>.<要替換的非Replicated表> AND <目標庫>.<建立的Replicated表> ON CLUSTER default;