CREATE DATABASE AS (CDAS) 文は、スキーマ変更を含め、データベース全体のテーブルスキーマとデータをリアルタイムで同期します。ソースデータベースから複数またはすべてのテーブルを送信先にレプリケートする必要があり、事前に結果テーブルを作成したくない場合に使用します。
新しいジョブでは、代わりにデータインジェスト用の YAMLを使用してください。YAML は、データベースとテーブルの同期、スキーマ進化、カスタム計算列、生バイナリログ同期、WHERE 句フィルタリング、および列のプルーニングなど、すべてのコア CDAS 機能をサポートしており、CTAS または CDAS 文を含む既存の SQL 下書きを変換できます。詳細については、「Flink CDC を使用したデータインジェスト」をご参照ください。
仕組み
CDAS はCREATE TABLE AS (CTAS) の糖衣構文です。CDAS 文を実行すると、Realtime Compute for Apache Flink は次の処理を行います。
-
送信先データベースおよび結果テーブルが存在するかどうかを確認します。
-
送信先データベースが存在しない場合、Flink は送信先カタログ経由でそれを作成します。
-
送信先データベースが存在する場合、Flink は結果テーブルを確認します。
-
結果テーブルが存在しない場合、Flink はソーステーブルと同一の名前およびスキーマを持つテーブルを作成します。
-
結果テーブルがすでに存在する場合、Flink はテーブル作成をスキップします。
-
-
-
データ同期ジョブを開始します。データおよびスキーマ変更がソースデータベースから送信先へ継続的にレプリケートされます。
複数の 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_db01 ~ order_db99 という名前のシャードがあります。各シャードには order や order_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 である必要があります。
-
デプロイメント ページで、対象のデプロイメントを見つけ、操作 列の キャンセル をクリックします。
-
ダイアログで、詳細戦略 を展開し、セーブポイント付きで停止 を選択して、OK をクリックします。
-
SQL ドラフトに次の文を追加します。
SET 'table.cdas.scan.newly-added-table.enabled' = 'true'; -
デプロイ をクリックします。
-
セーブポイントからジョブを復元します。
-
デプロイメント ページで、デプロイメント名をクリックします。
-
デプロイメント詳細ページで、ステート タブ、次に 履歴 サブタブをクリックします。
-
セーブポイント リストで、ジョブを停止した際に作成されたセーブポイントを見つけます。
-
操作 列で、その他 > このセーブポイントからジョブを開始 を選択します。「ジョブの開始」をご参照ください。
-
複数の CDAS および CTAS 文を 1 つのジョブとして実行
単一のジョブで複数のデータベースを同期し、ソースの再利用を最大化します。
シナリオ: tpcds、tpch、および user_db01~user_db99 のシャードを 1 つのジョブで Hologres に同期します。
ソリューション: すべての文を STATEMENT SET ブロックで囲みます。Flink はすべての文で単一のソース頂点を再利用するため、サーバー ID 数、データベース接続数、および全体的な読み取り負荷(特に MySQL CDC ソースの場合)が削減されます。
-
ソースの再利用を有効にするには、すべてのソーステーブルでコネクタオプションが同一である必要があります。
-
サーバー ID の構成については、「バイナリログ消費の競合を回避するためにサーバー ID を設定する」をご参照ください。
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}' は tpcds の table1 を tpcds-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 への同期」をご参照ください。
よくある質問
ランタイムエラー
ジョブパフォーマンス
データ同期
次のステップ
-
CDAS でよく使用されるカタログ:
-
関連機能:
-
YAML によるデータインジェスト: