Openflow Connector for SQL Server について

注釈

このコネクタは、 Snowflakeコネクタ規約 に従うものとします。

このトピックでは、|Sqlserver|の基本的な概念、ワークフロー、および制限について説明します。

Openflow Connector for SQL Server について

|Sqlserver|はSQL ServerデータベースインスタンスをSnowflakeに接続し、選択したテーブルからほぼリアルタイムまたはスケジュールに従ってデータを複製します。コネクタは、複製されたテーブルの現在の状態とともに利用可能なすべてのデータ変更のログも作成します。

ユースケース

このコネクタは、以下を実行する場合に使用します。

  • 包括的な一元化されたレポートのための、Snowflakeを使ったSQL ServerデータのCDC複製。

サポートされている SQL Serverバージョン

次のSQL Serverデータベースのバージョンとプラットフォームがサポートされています。

注釈

コネクタはSQL Server Change Trackingに依存しています。これはSQL Server 2008から利用可能です。以前のバージョンはこの機能をサポートしておらず、コネクタと互換性がありません。

Openflow要件

  • ランタイムのサイズはM以上である必要があります。大量のデータを複製する場合、特に行サイズが大きい場合は、より大きなランタイムを使用します。

  • コネクタは、マルチノードのOpenflowランタイムをサポートしていません。このコネクタのランタイムを、 Min nodes および Max nodes1 に設定して構成します。

制限事項

  • 単一のランタイムインスタンスで同じタイプのコネクタを複数実行することはできません。

  • コネクタは、 SQL Serverでのユーザー名とパスワードによる認証のみをサポートしています。

  • コネクタは、Snowflakeでサポートされているデータ型のテーブルのみを複製します。これらのデータ型のリストについては、 データ型の概要 をご参照ください。

  • コネクタは、主キーを含むデータベーステーブルのみを複製します。

  • デフォルト値を持つ新しいNOT NULL列がソースデータベースの1つに追加された場合、コネクタはSnowflakeデータベース内の既存の記録を更新しません。

  • 列フィルター JSON に含まれたリストに新しい列が追加されても、コネクタはSnowflakeデータベースの既存の記録を更新しません。

  • ソースデータベースのいずれかで列を削除し、同じ名前で再度追加すると、追加の削除によってエラーが発生します。

  • 列フィルターJSONに列を追加して除外した場合、さらに追加を試行するとエラーが発生します。

  • コネクタは、主キーの定義の変更、数値列の精度またはスケールの変更を除き、ソーステーブルスキーマの変更をサポートします。

  • コネクタは、テーブルの切り捨て操作をサポートしていません。

  • コネクタは、ドロップされた列の再追加をサポートしていません。

  • コネクタは、16MBより大きい個々の値を複製しません。デフォルトでは、このような値を処理すると、関連するテーブルは永続的な失敗としてマークされます。テーブルの失敗を防ぐには、**オーバーサイズ値戦略**の宛先パラメーターを変更します。

注釈

特定の列を複製から除外することで、特定のテーブル列に影響を与える制限を回避できます。

ワークフロー

以下のワークフローは、|Sqlserver|をセットアップして実行する手順の概要を示しています。

  1. SQL Serverデータベース管理者は以下のタスクを実行します。

    1. SQL Serverの複製設定を構成し、複製されるデータベースとテーブルの変更追跡を有効にします。

    2. コネクタの認証情報を作成します。

    3. (オプション)SSL経由でSQL Server インスタンスに接続するためのSSL証明書を提供します。

  2. Snowflakeアカウント管理者は以下のタスクを実行します。

    1. コネクタのサービスユーザー、複製されたデータを格納する宛先データベース、コネクタのウェアハウスを作成します。

    2. コネクタをインストールします。

    3. コネクタフロー定義に必要なパラメーターを指定します。

    4. フローを実行します。

Openflowで実行する場合、コネクタは以下を実行します。

  1. 複製用に構成されたソーステーブルと一致するスキーマと宛先テーブルを作成します。

  2. テーブル複製ライフサイクルに従って複製を開始します。

    詳細については、 テーブルの複製方法 をご参照ください。

コネクタの仕組み

以下のセクションでは、複製、スキーマの変更、データ保持など、さまざまなシナリオでコネクタがどのように機能するかについて説明します。

データ複製

コネクタは、単一のSQL Serverインスタンス内の複数のSQL Serverデータベースからのテーブルの複製をサポートします。コネクタは、宛先Snowflakeデータベースの個別のスキーマにある異なるデータベースから複製されたテーブルを作成します。

ソースデータベース名、ソーススキーマ名、テーブル名を次の形式で組み合わせて、複製されたテーブルを参照します。

<database_name>.<schema_name>.<table_name>

複製される各ソースデータベースのスキーマごとに、コネクタは宛先のSnowflakeデータベースに個別のスキーマを作成します。宛先スキーマの名前は、次の例に示すように、ソースデータベース名とソーススキーマ名をアンダースコア文字(_)で区切った組み合わせで表されます。

<source_database_name>_<source_schema_name>

次の例に示すように、コネクタは宛先スキーマにソーステーブル名と同じ名前のテーブルを作成します。

<destination_database>_<destination_schema_name>.<source_table_name>

テーブルの複製方法

コネクタは以下のステージでテーブルを複製します。

  1. スキーマのイントロスペクション:コネクタは、列名やタイプなどのソーステーブル内の列を検出し、それらをSnowflakeとコネクタの制限に照らして検証します。検証に失敗するとこのステージが失敗し、サイクルが完了します。このステージが成功して完了すると、コネクタは空の宛先テーブルを作成します。

  2. スナップショットのロード:コネクタは、ソーステーブルで使用可能なすべてのデータを宛先テーブルにコピーします。このステージが失敗すると、コネクタはデータの複製を停止します。成功して完了すると、ソーステーブルのデータが宛先テーブルで使用できるようになります。

  3. 増分ロード: コネクタはソーステーブルの変更を追跡し、その変更を宛先テーブルに適用します。このプロセスはテーブルが複製から削除されるまで続きます。このステージで失敗すると、問題が解決するまでソーステーブルの複製が永久的に停止します。

スナップショットロードのバイパスと増分ロードプロセスの使用については、 増分複製 をご参照ください。

テーブル複製ステータス

接続エラーなどの一時的な障害は、テーブルの複製を妨げません。ただし、サポートされていないデータ型などの永続的な障害はテーブルの複製を妨げます。

複製の問題をトラブルシューティングする、または複製フローからテーブルが正常に削除されたことを確認するには、テーブル状態ストアをチェックします。

  1. Openflowランタイムキャンバスで、プロセッサーグループを右クリックし、Controller Services を選択します。コントローラーサービスをリストしたテーブルが表示されます。

  2. Table State Store というラベルの行を見つけて、行の右側にある More 他のオプションを示す3つの垂直の点 ボタンをクリックし、View State を選択します。

テーブルとその現在の状態が書かれたリストが表示されます。検索ボックスに入力して、テーブル名でリストをフィルタリングします。可能な状態は次のとおりです。

  • NEW:テーブルは複製がスケジュールされていますが、複製は開始されていません。

  • SNAPSHOT_REPLICATION:コネクタは既存のデータをコピーしています。このステータスは、すべての記録が宛先テーブルに保存されるまで表示されます。

  • INCREMENTAL_REPLICATION:コネクタは変更をアクティブに複製しています。このステータスは、スナップショット複製の終了後に表示され、テーブルが複製から削除されるか、複製が失敗するまで無期限に表示され続けます。

  • FAILED:エラーのため、複製が完全に停止しています。

注釈

Openflowランタイムキャンバスにはテーブルステータスの変更は表示されず、現在のテーブルステータスのみが表示されます。ただし、テーブルステータスの変更は発生するとログに記録されます。次のログメッセージを探します。

Replication state for table <database_name>.<schema_name>.<table_name> changed from <old_state> to <new_state>
Copy

永続的な障害によりテーブルの複製が妨げられた場合は、複製からテーブルが削除されます。失敗の原因となった問題に対処した後、複製にテーブルを追加し直すことができます。詳細については、:ref:`テーブル複製の再開 <label-of_sql_server_restart_table_replication>`をご参照ください。

データ保持について

コネクタは、顧客データが自動的に削除されることのないデータ保持原則に従います。お客様は複製されたデータに対する完全な所有権と制御を維持し、コネクタは履歴情報を完全に削除するのではなく保持します。

このアプローチには次のような意味があります。

  • ソーステーブルから削除された行は、物理的に削除されるのではなく、宛先テーブルでソフト削除されます。

  • ソーステーブルからドロップされた列は、宛先テーブルではドロップされるのではなく名前が変更されます。

  • ジャーナルテーブルは無期限に保持され、自動的にクリーンアップされません。

宛先テーブルのメタデータ列

各宛先テーブルには、複製情報を追跡する次のメタデータ列が含まれます。

列名

説明

_SNOWFLAKE_INSERTED_AT

TIMESTAMP_NTZ

行が最初に宛先テーブルに挿入されたときのタイムスタンプ。

_SNOWFLAKE_UPDATED_AT

TIMESTAMP_NTZ

宛先テーブルで行が最後に更新されたときのタイムスタンプ。

_SNOWFLAKE_DELETED

BOOLEAN

行がソーステーブルから削除されたかどうかを示します。``true``の場合、行はソフト削除されており、ソースには存在しなくなります。

ソフト削除された行

ソーステーブルから行が削除されても、コネクタはそれを宛先テーブルから物理的に削除しません。代わりに、``_SNOWFLAKE_DELETED``メタデータ列を``true``に設定することにより、行は削除済みとしてマークされます。

このアプローチにより、以下が可能になります。

  • 監査またはコンプライアンスの目的で履歴データを保持する。

  • 必要に応じて削除されたレコードをクエリする。

  • 要件に基づいて、データを完全に削除するタイミングと方法を決定する。

アクティブな(削除されていない)行のみをクエリするには、``_SNOWFLAKE_DELETED``列でフィルターします。

SELECT * FROM my_table WHERE _SNOWFLAKE_DELETED = FALSE;
Copy

削除された行をクエリするには、以下のようにします。

SELECT * FROM my_table WHERE _SNOWFLAKE_DELETED = TRUE;
Copy

ドロップされた列

ソーステーブルから列がドロップされても、コネクタは宛先テーブルから対応する列をドロップしません。代わりに、履歴値を保持するために``__SNOWFLAKE_DELETED``サフィックスを追加して列の名前が変更されます。

たとえば、``EMAIL``という名前の列がソーステーブルからドロップされた場合、宛先テーブルでは``EMAIL__SNOWFLAKE_DELETED``に名前が変更されます。列がドロップされる前に存在していた行は元の値を保持しますが、ドロップ後に追加された行はこの列に``NULL``を持ちます。

名前が変更された列から履歴値を引き続きクエリできます。

SELECT EMAIL__SNOWFLAKE_DELETED FROM my_table;
Copy

列の名前の変更

CDC(変更データキャプチャ)メカニズムの制限により、コネクタは、列の名前変更と、列のドロップおよびその後の新しい列の追加を区別できません。その結果、ソーステーブルで列の名前を変更すると、コネクタはこれを元の列のドロップと、新しい名前の新しい列の追加という2つの別個の操作として扱います。

たとえば、ソーステーブルで列の名前を``A``から``B``に変更した場合、宛先テーブルには次が含まれます。

  • A__SNOWFLAKE_DELETED:名前変更前の値が含まれます。名前変更後に追加された行は、この列が``NULL``です。

  • B:名前変更後の値が含まれます。名前変更前に存在していた行は、この列が``NULL``です。

名前を変更した列のクエリ

元の列と名前が変更された列の両方からデータを、単一の統合された列として取得するには、``COALESCE``または``CASE``式を使用します。

SELECT
    COALESCE(B, A__SNOWFLAKE_DELETED) AS A_RENAMED_TO_B
FROM my_table;
Copy

または、``CASE``式を使用します。

SELECT
    CASE
        WHEN B IS NOT NULL THEN B
        ELSE A__SNOWFLAKE_DELETED
    END AS A_RENAMED_TO_B
FROM my_table;
Copy

名前を変更した列のビューの作成

宛先テーブルを手動で変更するのではなく、名前が変更された列を単一の統合された列として表示するビューを作成できます。このアプローチは、元のデータを保持し、進行中の複製に関する潜在的な問題を回避するために、推奨されます。

CREATE VIEW my_table_unified AS
SELECT
    *,
    COALESCE(B, A__SNOWFLAKE_DELETED) AS A_RENAMED_TO_B
FROM my_table;
Copy

重要

宛先テーブルの構造(列のドロップや名前変更など)を手動で変更することは推奨されません。進行中の複製に干渉して、データの不整合を引き起こす可能性があるためです。

ジャーナルテーブル

増分複製において、ソースデータベースからの変更は、宛先テーブルにマージされる前に、最初にジャーナルテーブルに書き込まれます。コネクタは、ジャーナルテーブルからデータを自動的に削除しません。このデータは、監査、デバッグ、再処理の目的で役立つ場合があります。

ジャーナルテーブルは、対応する宛先テーブルと同じスキーマで作成され、次の命名規則に従います。

<TABLE_NAME>_JOURNAL_<timestamp>_<number>

条件:

  • ``<TABLE_NAME>``は宛先テーブルの名前である。

  • ``<timestamp>``はUnixエポック形式(1970年1月1日からの秒数)の作成タイムスタンプであり、一意性を確保する。

  • ``<number>``は1から始まり、ソーステーブルのスキーマ変更または列フィルターの変更により宛先テーブルスキーマが変更されるたびに増加します。

たとえば、宛先テーブルが``SALES.ORDERS``の場合、ジャーナルテーブルの名前は``SALES.ORDERS_JOURNAL_1705320000_1``になる可能性があります。

重要

複製の進行中はジャーナルテーブルをドロップしないでください。アクティブなジャーナルテーブルを削除すると、データが失われたり、複製に失敗したりする可能性があります。対応するソーステーブルが複製から完全に削除された後にのみ、ジャーナルテーブルをドロップします。

ジャーナルテーブルストレージの管理

古いジャーナルデータを削除してストレージコストを管理する必要がある場合は、複製されなくなったテーブルのジャーナルテーブルを定期的にクリーンアップするSnowflakeタスクを作成できます。

ジャーナルのクリーンアップを実装する前に、次を確認してください。

  • 対応するソーステーブルが複製から完全に削除されていること。

  • 監査や処理の目的でジャーナルデータが不要であること。

自動クリーンアップのためのタスクの作成と管理について詳しくは、:doc:`タスクの紹介</user-guide/tasks-intro>`を参照してください。

次のステップ

コネクタがデータ型をSnowflakeのデータ型にどのようにマップするかを理解するには、:doc:`data-mapping`を確認してください。

コネクタを設定するには、:doc:`setup`を確認してください。