全部產品
Search
文件中心

Realtime Compute for Apache Flink:CREATE DATABASE AS(CDAS)語句

更新時間:Jul 13, 2024

CDAS支援整庫層級的表結構和資料的即時同步,還支援表結構變更的同步。本文為您介紹CREATE DATABASE AS(CDAS)的使用方法,並提供了多種使用情境下的樣本。

背景資訊

CDAS是CTAS文法的一個文法糖,用於實現整庫同步、多表同步的功能。阿里雲Flink引擎會將CDAS語句中每個需要同步的表翻譯成一個對應的CTAS語句。因此,CDAS還擁有CTAS的資料同步和表結構變更同步的能力,常用於全自動化的Data Integration情境。此外,阿里雲Flink還能對源表進行最佳化,複用一個源表節點讀取多業務表的資料。這對於MySQL CDC資料來源情境尤為適用,因為不僅可以減少資料庫的串連數,還能避免重複拉取Binlog資料,以降低資料庫的讀取壓力。

使用限制

  • 僅Flink計算引擎vvr-4.0.11-flink-1.13及以上版本支援CDAS文法。

    重要

    CDAS文法不支援進行調試。

  • 僅Flink計算引擎vvr-4.0.13-flink-1.13及以上版本支援分庫合并同步。

  • CDAS支援的上下遊儲存列表如下。

    連接器名稱

    源表

    結果表

    備忘

    MySQL

    ×

    不支援同步MySQL視圖。

    訊息佇列Kafka

    ×

    無。

    MongoDB

    ×

    • 暫不支援分庫合并同步。

    • 暫不支援同步MongoDB元資訊。

    • 支援通過CDAS語句將MongoDB中的資料及表結構變更同步至目標表。具體的配置要求請參見使用MongoDB Catalog

    Upsert Kafka

    ×

    無。

    即時數倉Hologres

    ×

    如果下遊是Hologres,CDAS在預設情況下會為每個表建立相應數量(connectionSize參數值)個串連。此時您可以使用connectionPoolName參數,讓配置相同名稱串連池的表可以共用串連池。

    說明
    • 在將資料同步到Hologres時,如果您的上遊源表包含了Fixed Plan不支援類型的資料,建議通過INSERT INTO語句的方式,在Flink內部做類型轉換後將資料同步到Hologres。不要用CDAS方式建立Sink結果表進行資料同步,因為這種方式會無法走Fixed Plan,寫入效能較差。

    • Realtime ComputeFlink版僅支援讀寫Hologres內表,因此Hologres執行個體必須是獨佔執行個體,不支援Hologres共用叢集執行個體

    StarRocks

    ×

    僅支援EMR的StarRocks。

    流式資料湖倉Paimon

    ×

    僅Flink計算引擎vvr-6.0.7-flink-1.15及以上版本支援Paimon結果表。

前提條件

  • 執行CDAS文法前,確保工作空間中登入目標端的Catalog,詳情請參見管理中繼資料

  • 執行CDAS文法前,如果您需要訪問不同帳號下的上下遊資源、以及使用RAM使用者或RAM角色等身份訪問時,請確保登入Flink全託管的帳號具有讀寫上下遊資源的許可權,否則會因為許可權不足導致讀寫操作失敗。

注意事項

  • 使用VVR 8.0.6及以上版本時,CDAS作業啟動後,支援添加新表後從作業快照重啟,從而捕獲到新的表。詳情請參見樣本三:源庫新增表加入資料同步

  • 使用VVR 8.0.5及以下版本時,CDAS作業啟動後,作業同步的表已經確定,資料庫中新增的表不會自動貼齊,也無法通過重啟作業的方式捕獲到。如果需要同步新增的表,您可以選擇以下任一種方案:

    • 原有CDAS作業不變,啟動一個新的作業同步新增的表。例如

      // 建立CTAS作業同步新增加的表new_table
      CREATE TABLE IF NOT EXISTS new_table
      AS TABLE mysql.tpcds.new_table 
      /*+ OPTIONS('server-id'='8008-8010') */;
    • 停止現有CDAS作業,清理已同步的資料後,以全新狀態重啟CDAS作業來重新同步資料。

功能特性

功能

詳情

整庫同步

支援即時同步整庫(或者多張表)的全量和增量資料到每張對應的結果表中。

表結構變更同步

在即時同步整庫資料的同時,還支援將每張源表的表結構變更(加列等)即時同步到結果表中。

分庫合并同步

支援使用Regex定義庫名,匹配資料來源的多個分庫下的源表,合并後同步到下遊每張對應表名的結果表中。

源庫新增表加入資料同步

CDAS作業啟動後,如果源庫新增表,支援從作業快照重啟,從而捕獲到新的表,對新增表進行資料同步。

多CDAS&CTAS語句

支援使用STATEMENT SET文法將多個CDAS和CTAS語句作為一個作業一起提交,並支援對源表節點的合并複用,降低對資料來源的壓力。

啟動流程

當執行CDAS語句時,阿里雲Flink將會按照以下流程執行:

  1. 檢查目標儲存中是否存在目標庫和結果表。

    • 如果不存在目標庫,則通過目標端Catalog去目標儲存中建立相應的目標庫。

    • 如果存在目標庫,則跳過建庫,並檢查目標庫是否存在該結果表。

      • 如果不存在,則在目標庫中建立相應的結果表,該結果表具有和源庫中表相同的表名和Schema。

      • 如果存在,則跳過建表。

  2. 提交和啟動相應的資料同步作業。將源庫中的資料以及Schema變更同步到目標庫下的表中。

例如,從MySQL到Hologres的CDAS資料同步流程如下圖所示。CDAS示意圖

表結構變更同步策略

因為CDAS是CTAS文法的一個文法糖,所以表結構變更能力與CTAS一致,詳情請參見CREATE TABLE AS(CTAS)語句

基本文法

CREATE DATABASE IF NOT EXISTS <target_database>
[COMMENT database_comment]
[WITH (key1=val1, key2=val2, ...)]
AS DATABASE <source_database>
INCLUDING { ALL TABLES | TABLE 'table_name' }
[EXCLUDING TABLE 'table_name']
[/*+ OPTIONS(key1=val1, key2=val2, ... ) */]

<target_database>:
  [catalog_name.]db_name

<source_database>:
  [catalog_name.]db_name

CDAS文法複用了CREATE DATABASE文法的基本結構,其中的參數解釋如下表所示。

參數

說明

target_database

資料同步的目標資料庫名,可以指定具體的Catalog名稱。

COMMENT

目標庫的描述,預設使用source_database的描述。

WITH

目標庫的參數,詳情請參見管理中繼資料中對應的Catalog文檔。

說明

key和value都需要為字串類型,例如'sink.parallelism' = '4'

source_database

資料同步的源庫名稱,可以指定具體的Catalog名稱。

INCLUDING ALL TABLES

同步源庫中的所有表。

INCLUDING TABLE

同步源庫中指定的表。支援使用豎線(|)分隔指定多個表,也可以使用Regex指定符合某一規則的表。例如INCLUDING TABLE 'web.*'表示要同步源庫中所有web開頭的表。

EXCLUDING TABLE

用於指定不需要同步的表,支援使用豎線(|)分隔指定多個表,也可以使用Regex指定符合某一規則的表,例如INCLUDING ALL TABLES EXCLUDING TABLE 'web.*'表示同步源庫中所有不是web開頭的表。

OPTIONS

源表的參數,詳情請參見對應連接器支援的源表WITH參數。

說明

key和value都需要為字串類型,例如'server-id' = '65500'

說明

因為IF NOT EXISTS關鍵字為必填,所以如果目標庫或結果表在目標儲存中並不存在,則會先建立該目標庫和結果表,否則跳過建立步驟。建立的結果表Schema會使用源表的Schema,包括主鍵以及物理欄位的欄位名和欄位類型,不包括計算資料行、meta欄位、Watermark。其中源表到結果表的欄位類型會經過類型映射,詳見對應連接器文檔中的類型映射。

樣本

樣本一:整庫同步

CDAS通常會配合資料來源的Catalog和目標的Catalog一起使用。例如,MySQL Catalog和Hologres Catalog結合CDAS文法,完成MySQL到Hologres的全量和增量資料同步。使用MySQL Catalog可以自動解析源表的Schema及相應的參數,而不用手動編寫DDL。

假設已在工作空間中註冊了名為holo的Hologres Catalog和名為mysql的MySQL Catalog,MySQL中有一個名為tpcds的庫。您可以使用以下語句將tpcds庫下的24張表全部同步到Hologres中,包括未來的資料變更和表結構變更,無需提前在Hologres中建立表。

USE CATALOG holo;

CREATE DATABASE IF NOT EXISTS holo_tpcds  -- 在hologres中建立holo_tpcds庫。
WITH ('sink.parallelism' = '4') -- 可選,指定目標庫的參數,每個holo sink預設使用4並發。
AS DATABASE mysql.tpcds INCLUDING ALL TABLES  -- 同步mysql中tpcds庫下所有表。
/*+ OPTIONS('server-id'='8001-8004') */ ; -- 可選,指定mysql-cdc源表的額外參數。
說明

Hologres支援在建立目標Database時指定WITH參數,這些參數僅對當前作業生效,用於控制寫入結果表時的行為,不會持久化到Hologres中。支援的WITH參數詳情請參見即時數倉Hologres

樣本二:分庫合并同步

對於分庫合并同步的情境,需要利用Regex的庫名來匹配所要同步的多個分庫。使用CDAS可以將上遊多個分庫下相同表名的資料合併同步到Hologres目標庫對應表名的同一張表中,庫名和表名會作為額外的兩個欄位寫入到每張結果表中。為保證主鍵唯一性,庫名、表名和原主鍵一起作為對應Hologres表的新聯合主鍵。

假設MySQL執行個體中有order_db01~order_db99多個分庫,每個分庫下都有order、order_detail等多張表。您可以使用以下語句將99個分庫下的order、order_detail等表全部同步到Hologres中,包括未來的資料變更和表結構變更,無需提前在Hologres中建立表。order1

USE CATALOG holo;

CREATE DATABASE IF NOT EXISTS holo_order--在Hologres中建立holo_order庫,包括mysql中order分庫的所有表。
WITH('sink.parallelism'='4')        --可選,指定目標庫的參數,每個HologresSink預設並發為4。
AS DATABASE mysql.`order_db[0-9]+` INCLUDING ALL TABLES --同步mysql中order_db分庫下所有表。
/*+OPTIONS('server-id'='8001-8004')*/;  --可選,指定mysql-cdc源表的額外參數。

樣本三:源庫新增表加入資料同步

使用VVR 8.0.6及以上版本時,CDAS作業啟動後,如果源庫新增表,支援從作業快照重啟,從而捕獲到新的表,對新增表進行資料同步。

  1. SQL作業開發時需要增加以下語句,開啟CDAS新增表讀取功能。

    SET 'table.cdas.scan.newly-added-table.enabled' = 'true';
  2. 當出現新增的表需要同步時,停止作業並勾選停止前建立一次快照

  3. SQL開發中,重新部署這個SQL作業。

  4. 作業營運頁面單擊目標作業名稱,狀態集管理頁簽,單擊歷史

  5. 作業快照列表中,找到停止作業時建立的快照。

  6. 單擊目標快照操作列,選擇更多 > 從該快照恢複作業

  7. 作業啟動配置對話方塊,配置作業啟動資訊,詳情請參見作業啟動

重要

新增表功能只能用於預設的initial啟動模式。

樣本四:多CDAS&CTAS語句

Realtime ComputeFlink版支援使用STATEMENT SET文法將多個CTAS語句作為一個作業一起提交,並且可以對Source進行最佳化,複用一個Source節點讀取多業務表的資料。這對於MySQL CDC資料來源情境尤為適用,因為這可以減少server-id的使用,減少對資料庫的串連數和讀取壓力。

說明

對於Source複用最佳化,需要這些Source表的options保持完全一致,才能合并成功進行複用。

假設MySQL執行個體中有tpcds、tpch、user_db01~user_db99(分庫分表)多個庫。您可以通過組合多條CDAS和CTAS語句,將MySQL執行個體下的所有庫和表都同步到Hologres,只需一個Flink作業便能完成所有表的同步,只需一個Source便能讀取所有表的資料,程式碼範例如下。

USE CATALOG holo;

BEGIN STATEMENT SET;

-- 同步user分庫分表。
CREATE TABLE IF NOT EXISTS user
AS TABLE mysql.`user_db[0-9]+`.`user[0-9]+`
/*+ OPTIONS('server-id'='8001-8004') */;

-- 同步TPCDS庫。
CREATE DATABASE IF NOT EXISTS holo_tpcds
AS DATABASE mysql.tpcds INCLUDING ALL TABLES
/*+ OPTIONS('server-id'='8001-8004') */ ;
-- 同步TPCH庫。
CREATE DATABASE IF NOT EXISTS holo_tpch
AS DATABASE mysql.tpch INCLUDING ALL TABLES
/*+ OPTIONS('server-id'='8001-8004') */ ;

END;

樣本五:多CDAS語句整庫同步到Kafka

在使用多個CDAS語句整庫同步到Kafka時,由於不同的資料庫中可能存在相同的表,為了防止topic衝突,需要使用cdas.topic.pattern配置。cdas.topic.pattern定義了建立topic的名稱的格式,其中可通過{table-name}預留位置來替換為表名。如:當設定'cdas.topic.pattern'='db1-{table-name}',對於上遊表名為table1的表,在Kafka中對應的topic名稱為db1-table1

假設MySQL執行個體中有tpcds、tpch多個庫。您可以通過如下方式將MySQL執行個體下的所有庫和表都同步到Kafka,避免topic衝突,程式碼範例如下。

USE CATALOG kafkaCatalog;

BEGIN STATEMENT SET;

-- 同步TPCDS庫。
CREATE DATABASE IF NOT EXISTS kafka
WITH ('cdas.topic.pattern' = 'tpcds-{table-name}')
AS DATABASE mysql.tpcds INCLUDING ALL TABLES
/*+ OPTIONS('server-id'='8001-8004') */ ;

-- 同步TPCH庫。
CREATE DATABASE IF NOT EXISTS kafka
WITH ('cdas.topic.pattern' = 'tpch-{table-name}')
AS DATABASE mysql.tpch INCLUDING ALL TABLES
/*+ OPTIONS('server-id'='8001-8004') */ ;

END;

Realtime ComputeFlink版提供MySQL整庫同步到Kafka的能力,通過引入Kafka作為中介層,並使用CDAS整庫同步或CTAS整表同步到Kafka來解決,具體操作請參見MySQL整庫同步Kafka

相關文檔