すべてのプロダクト
Search
ドキュメントセンター

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

最終更新日:May 07, 2026

CREATE DATABASE AS (CDAS) 文は、スキーマ変更を含め、データベース全体のテーブルスキーマとデータをリアルタイムで同期します。ソースデータベースから複数またはすべてのテーブルを送信先にレプリケートする必要があり、事前に結果テーブルを作成したくない場合に使用します。

新しいジョブでは、代わりにデータインジェスト用の YAMLを使用してください。YAML は、データベースとテーブルの同期、スキーマ進化、カスタム計算列、生バイナリログ同期、WHERE 句フィルタリング、および列のプルーニングなど、すべてのコア CDAS 機能をサポートしており、CTAS または CDAS 文を含む既存の SQL 下書きを変換できます。詳細については、「Flink CDC を使用したデータインジェスト」をご参照ください。

仕組み

CDAS はCREATE TABLE AS (CTAS) の糖衣構文です。CDAS 文を実行すると、Realtime Compute for Apache Flink は次の処理を行います。

  1. 送信先データベースおよび結果テーブルが存在するかどうかを確認します。

    • 送信先データベースが存在しない場合、Flink は送信先カタログ経由でそれを作成します。

    • 送信先データベースが存在する場合、Flink は結果テーブルを確認します。

      • 結果テーブルが存在しない場合、Flink はソーステーブルと同一の名前およびスキーマを持つテーブルを作成します。

      • 結果テーブルがすでに存在する場合、Flink はテーブル作成をスキップします。

  2. データ同期ジョブを開始します。データおよびスキーマ変更がソースデータベースから送信先へ継続的にレプリケートされます。

複数の CTAS 文ではなく CDAS を使用する理由:

  • 構文の簡素化: Flink は 1 つの CDAS 文を自動的に各テーブルごとの 1 つの CTAS 文に展開します。

  • リソース使用量の最適化: Flink は単一のソース頂点を使用して一致するすべてのテーブルから読み取ります。MySQL Change Data Capture (CDC) ソースの場合、これによりデータベース接続数が削減され、冗長なバイナリログ読み取りが回避され、MySQL データベース全体の読み取り負荷が軽減されます。

コア機能

データ同期

機能 説明
データベースの同期 データベース内の複数(またはすべて)のテーブルから完全データおよび増分同期を実行し、それぞれ対応する結果テーブルに同期します。
データベースシャードの統合と同期 正規表現を使用して複数のデータベースシャード間でソーステーブル名をマッチさせ、これらのテーブルを統合して対応する送信先に同期します。
新規テーブルの同期 セーブポイントからジョブを再起動することで、新たに追加されたテーブルを同期します。
複数の CDAS および CTAS 文を 1 つのジョブとして実行 STATEMENT SET 文を使用して、複数の CDAS および CTAS 文を 1 つのジョブとしてコミットできます。また、ソーステーブル演算子のデータをマージおよび再利用して、データソースの読み取り負荷を軽減することも可能です。

スキーマ進化

CDAS がデータベースを同期する際、列の追加などのスキーマ変更が自動的に結果テーブルに反映されます。その動作およびポリシーは CTAS と同様です。詳細については、「スキーマ進化」をご参照ください。

前提条件

作業を開始する前に、次の要件を満たしていることを確認してください。

  • ワークスペースに送信先カタログが登録されていること。「カタログ」をご参照ください。

制限事項

構文に関する制限

  • CDAS 文を含む SQL ドラフトのデバッグはサポートされていません。

  • MiniBatch はサポートされていません。

    重要

    CTAS または CDAS 文を使用して SQL ドラフトを作成する前に、すべての MiniBatch 構成を削除してください。1. [O&M] > [構成] に移動します。2. [デプロイメントのデフォルト] タブを選択します。3. [その他の構成] セクションで、MiniBatch 構成が削除されていることを確認します。デプロイメントの作成時または開始時に「Currently does not support merge StreamExecMiniBatchAssigner type ExecNode in CTAS/CDAS syntax」というエラーが発生した場合は、このエラーを修正するにはどうすればよいですか。をご参照ください。

サポートされるコネクタ

コネクタ ソース シンク 注記
MySQL はい いいえ ビューは同期できません。
Kafka はい いいえ
MongoDB はい いいえ シャード化されたテーブルおよびデータベースの統合はサポートされていません。MongoDB メタデータは同期できません。セットアップ方法については、「MongoDB カタログの管理」をご参照ください。
Upsert Kafka いいえ はい
Hologres いいえ はい Flink は、connectionSize オプションに基づいて各テーブルごとに接続を作成します。connectionPoolName を使用して共有プールを構成してください。ソースデータの型が Hologres の固定プランでサポートされていない場合、書き込みパフォーマンスが低下するため CTAS 文ではなくINSERT INTO を使用してください(固定プランが使用できないため)。排他的 Hologres インスタンスのみ対応しています。共有クラスターインスタンス はサポートされていません。
StarRocks いいえ はい Alibaba Cloud EMR 上の StarRocks に限定されます。
Paimon いいえ はい

VVR 11.1 以降では、DLF 2.5 メタストアの Paimon 結果テーブルへのデータ同期がサポートされています。

注意事項

新規テーブルの同期

  • VVR 8.0.6 以降: 新規テーブルが追加された後、セーブポイントからジョブを再起動します。「新規テーブルの同期」をご参照ください。

  • VVR 8.0.5 以前: ジョブを再起動しても新規テーブルはキャプチャされません。代わりに以下のいずれかのアプローチを使用してください。

    アプローチ 手順
    新規テーブル用の新しいジョブを作成 既存のジョブを実行したままにします。新規テーブルのみを対象とする別のジョブを作成します。例:CREATE TABLE IF NOT EXISTS new_table AS TABLE mysql.tpcds.new_table /*+ OPTIONS('server-id'='8008-8010') */;
    クリーンアップして最初から再起動 1. 既存のジョブをキャンセルします。2. 結果側で同期されたデータをクリーンアップします。3. ステートなしでジョブを再起動します。

クロスアカウントおよび RAM アクセス

アカウント間で外部リソースにアクセスする場合、または RAM ユーザーまたは RAM ロールとしてアクセスする場合は、必要な読み取り/書き込み権限をアカウントに付与してください。

構文

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
`IF NOT EXISTS` は必須です。 これは Flink に対して、送信先に結果テーブルが存在するかどうかを確認するよう指示します。存在しない場合は Flink が作成し、存在する場合は作成をスキップします。
結果テーブルは、プライマリキーおよび物理フィールドの名前と型という点でソーステーブルと同じスキーマを共有しますが、計算列、メタデータフィールド、Watermark 構成は除外されます。
Flink はソースから送信先へのデータ型マッピングを実行します。詳細については、関連するコネクタ ドキュメントをご参照ください。

パラメーター

パラメーター 説明
target_database 送信先データベース名。カタログ名をプレフィックスとして指定可能:[catalog_name.]db_name
COMMENT 送信先データベースの説明。デフォルトではソースデータベースの説明が使用されます。
WITH 送信先データベースのオプション。キーと値は文字列である必要があります。例:'sink.parallelism' = '4'。コネクタ固有のオプションについては、「カタログ」をご参照ください。
source_database ソースデータベース名。カタログ名をプレフィックスとして指定可能:[catalog_name.]db_name
INCLUDING ALL TABLES ソースデータベース内のすべてのテーブルを同期します。
INCLUDING TABLE 同期するテーブルを指定します。複数のテーブルは | で区切ります。正規表現もサポートされています。例:INCLUDING TABLE 'web.*'web で始まるすべてのテーブルにマッチします。
EXCLUDING TABLE 同期から除外するテーブルを指定します。複数のテーブルは | で区切ります。正規表現もサポートされています。例:EXCLUDING TABLE 'tmp.*'tmp で始まるすべてのテーブルを除外します。
OPTIONS ソーステーブルのコネクタオプション。キーと値は文字列である必要があります。例:'server-id' = '65500'。「サポートされるコネクタ」をご参照ください。

使用例

データベースの同期

tpcds MySQL データベースのすべてのテーブルを Hologres に同期します。

前提条件:

  • ワークスペースに holo という名前の Hologres カタログが作成済みであること。

  • ワークスペースに mysql という名前の MySQL カタログが作成済みであること。

USE CATALOG holo;

CREATE DATABASE IF NOT EXISTS holo_tpcds          -- Hologres に holo_tpcds を作成。
WITH ('sink.parallelism' = '4')                   -- 結果の並列度を設定(Hologres のデフォルト:4)。
AS DATABASE mysql.tpcds INCLUDING ALL TABLES      -- mysql.tpcds のすべてのテーブルを同期。
/*+ OPTIONS('server-id'='8001-8004') */;          -- MySQL CDC ソースオプションを構成。
WITH 句で設定されたオプションは現在のジョブにのみ適用され、書き込み動作を制御します。これらのオプションは Hologres カタログには永続化されません。サポートされるオプションについては、「Hologres」をご参照ください。

データベースシャードの統合と同期

複数の MySQL データベースシャードにまたがる同一の名前のテーブルをすべてマージし、単一の Hologres テーブルに統合します。

シナリオ: MySQL インスタンスに order_db01order_db99 という名前のシャードがあります。各シャードには orderorder_detail などのテーブルが含まれています。すべてのシャードデータ(スキーマ変更を含む)を Hologres に集約する必要があります。

ソリューション: データベース名に対して正規表現を使用してすべてのシャードにマッチさせます。データベース名とテーブル名が、各結果テーブルに 2 つの追加フィールドとして追加されます。Hologres のプライマリキーには、データベース名、テーブル名、およびソーステーブルのプライマリキーカラムが含まれ、一意性が保証されます。ターゲットテーブルを事前に作成する必要はありません。

USE CATALOG holo;

CREATE DATABASE IF NOT EXISTS holo_order              -- Hologres に holo_order を作成。
WITH('sink.parallelism'='4')                          -- 結果の並列度を設定(任意)。
AS DATABASE mysql.`order_db[0-9]+` INCLUDING ALL TABLES  -- すべての order_db シャードにマッチ。
/*+ OPTIONS('server-id'='8001-8004') */;              -- MySQL CDC ソースオプションを構成(任意)。

シャード間で同一の名前を持つテーブルは、単一の Hologres テーブルにマージされます。

新規テーブルの同期

実行中の CDAS ジョブが開始された後、新規テーブル検出を有効にしてセーブポイントから再起動し、新たに追加されたテーブルをキャプチャします。

新規テーブル検出には VVR 8.0.6 以降が必要です。ソーステーブルの起動モードは initial である必要があります。
  1. デプロイメント ページで、対象のデプロイメントを見つけ、操作 列の キャンセル をクリックします。

  2. ダイアログで、詳細戦略 を展開し、セーブポイント付きで停止 を選択して、OK をクリックします。

  3. SQL ドラフトに次の文を追加します。

    SET 'table.cdas.scan.newly-added-table.enabled' = 'true';
  4. デプロイ をクリックします。

  5. セーブポイントからジョブを復元します。

    1. デプロイメント ページで、デプロイメント名をクリックします。

    2. デプロイメント詳細ページで、ステート タブ、次に 履歴 サブタブをクリックします。

    3. セーブポイント リストで、ジョブを停止した際に作成されたセーブポイントを見つけます。

    4. 操作 列で、その他 > このセーブポイントからジョブを開始 を選択します。「ジョブの開始」をご参照ください。

複数の CDAS および CTAS 文を 1 つのジョブとして実行

単一のジョブで複数のデータベースを同期し、ソースの再利用を最大化します。

シナリオ: tpcdstpch、および user_db01user_db99 のシャードを 1 つのジョブで Hologres に同期します。

ソリューション: すべての文を STATEMENT SET ブロックで囲みます。Flink はすべての文で単一のソース頂点を再利用するため、サーバー ID 数、データベース接続数、および全体的な読み取り負荷(特に MySQL CDC ソースの場合)が削減されます。

重要
USE CATALOG holo;

BEGIN STATEMENT SET;

-- すべての user_db シャードからユーザーテーブルを同期。
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;

複数の MySQL データベースを Kafka に同期

複数の MySQL データベースのテーブルを Kafka に同期し、トピック名の競合を回避します。

シナリオ: tpcds および tpch の両方に同じ名前のテーブルが存在します。これらを同じ Kafka トピックに送信すると、データが上書きされてしまいます。

ソリューション: cdas.topic.pattern オプションを使用して、データベースごとに一意のトピック名を生成します。{table-name} プレースホルダーは実行時に実際のテーブル名に置き換えられます。たとえば、'cdas.topic.pattern'='tpcds-{table-name}'tpcdstable1tpcds-table1 トピックにルートします。

USE CATALOG kafkaCatalog;

BEGIN STATEMENT SET;

-- tpcds データベースを同期。トピック名は "tpcds-<table_name>" パターンに従う。
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 データベースを同期。トピック名は "tpch-<table_name>" パターンに従う。
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;

MySQL と Flink の間に Kafka を中間レイヤーとして導入することで、MySQL の負荷も軽減されます。「Flink CDC による MySQL データベースの Kafka への同期」をご参照ください。

よくある質問

ランタイムエラー

ジョブパフォーマンス

データ同期

次のステップ