AlloyDB にデータをエクスポートする(リバース ETL)

このドキュメントでは、BigQuery から AlloyDB for PostgreSQL への逆方向の抽出、変換、読み込み(リバース ETL)ワークフローを設定する方法について説明します。これを行うには、EXPORT DATA ステートメントを使用します。

始める前に

  • エクスポートされたデータを受け取る AlloyDB クラスタとインスタンス(データベース、スキーマ、テーブルを含む)を作成します。エクスポート ジョブを実行する前に、ターゲット スキーマとテーブルが必要です。

  • ターゲット AlloyDB インスタンスは、READY 状態の PRIMARY インスタンスである必要があります。

  • BigQuery 接続を作成して、AlloyDB インスタンスに接続します。接続はユーザー名とパスワードで認証されている必要があります。接続で指定されたデータベース ユーザーには、ターゲット テーブルに対する INSERT 権限と、ターゲット スキーマに対する USAGE 権限が必要です。

  • BigQuery Enterprise または Enterprise Plus ティアの予約を作成します。

  • このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(IAM)のロールを付与します。

必要なロール

BigQuery データを AlloyDB にエクスポートするために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。

  • BigQuery テーブルからデータをエクスポートする: BigQuery データ閲覧者roles/bigquery.dataViewer
  • 抽出ジョブを実行する: BigQuery ユーザーroles/bigquery.user
  • BigQuery 接続を使用する: BigQuery 接続ユーザー roles/bigquery.connectionUser
  • AlloyDB インスタンスに接続する: AlloyDB クライアント(roles/alloydb.client) - 接続サービス アカウント

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

制限事項

  • AlloyDB のエクスポートは、バッチ エクスポートのみをサポートしています。継続的クエリを使用して AlloyDB にエクスポートすることはできません。

  • AlloyDB にエクスポートされたデータは、新しい行としてのみ追加されます。エクスポート プロセスでは、AlloyDB 内の既存のレコードが変更または削除されることはありません。ターゲット テーブルに PRIMARY KEY 制約または UNIQUE 制約が定義されていない場合、同じデータを複数回エクスポートすると、重複するエントリが作成されます。

  • データの完全性を確保するには、AlloyDB テーブルに PRIMARY KEY 制約または UNIQUE 制約を定義することをおすすめします。エクスポート ジョブでは、一意の照合キーがある場合に既存のレコードを更新する「upsert」は実行されません。入力行のいずれかが PRIMARY KEY 制約または UNIQUE 制約に違反している場合、エクスポート ジョブ全体が失敗します。

  • 同じ AlloyDB テーブルに対して複数の EXPORT DATA ジョブを同時に実行することはおすすめしません。これにより、データ損失やジョブの失敗など、予期しない動作が発生する可能性があります。一度に 1 つのエクスポート ジョブのみが特定のテーブルに書き込むことを確認することをおすすめします。

  • BigQuery 接続を介したユーザー名とパスワードの認証のみがサポートされています。

  • ARRAYBYTESGEOGRAPHYINTERVALSTRUCT の BigQuery データ型は対象外です。

  • BigQuery の SELECT ステートメントで、ターゲット AlloyDB テーブルに存在する列が省略されている場合、それらの列は NULL 値を許可するか、AlloyDB でデフォルト値が定義されている必要があります。NOT NULL 制約があり、デフォルト値がない場合、エクスポートは失敗します。

  • AlloyDB へのエクスポートは、BigQuery Enterprise エディションまたは Enterprise Plus エディションでのみサポートされています。BigQuery Standard エディションとオンデマンド コンピューティングはサポートされていません。詳細については、管理機能をご覧ください。

  • AlloyDB への抽出ジョブなどの BigQuery ジョブの最大期間は 6 時間です。非常に大きなエクスポートの場合は、エクスポートを複数の小さなジョブに分割することをおすすめします。

ロケーションに関する留意事項

AlloyDB にデータをエクスポートするには、BigQuery データセットと AlloyDB インスタンスのロケーションに関する特定の要件があります。

  • 同じリージョンへのエクスポート: ターゲットの AlloyDB インスタンスは、BigQuery データセットとまったく同じ Google Cloud リージョンに存在する必要があります。たとえば、us-east1 のデータセットは、us-east1 の AlloyDB インスタンスにのみエクスポートできます。

  • マルチリージョン エクスポート:

    • US マルチリージョンのデータセットは、us-central1 リージョンにある AlloyDB インスタンスにのみエクスポートできます。
    • EU マルチリージョンのデータセットは、europe-west4 リージョンにある AlloyDB インスタンスにのみエクスポートできます。

前述の組み合わせ以外のクロスリージョン エクスポートはサポートされていません。

alloydb_options を使用してエクスポートを構成する

alloydb_options オプションを使用して、宛先の AlloyDB スキーマ、テーブル、最大接続数を指定できます。構成は JSON 文字列として表されます。table パラメータのみが必須で、他のパラメータはすべて省略可能です。

エクスポートを構成するときに、SELECT ステートメントの列には、ターゲット AlloyDB テーブルの列名と一致するエイリアスが必要です。

EXPORT DATA
  WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_ID`
  OPTIONS(
    format='ALLOYDB',
    uri="https://alloydb.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_ID/instances/INSTANCE_ID",
    alloydb_options="""{
      "schema": "SCHEMA_NAME",
      "table": "TABLE_NAME",
      "max_parallel_connections": MAX_CONNECTIONS
    }"""
  )
AS SELECT * FROM `mydataset.table1`;

次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクトの名前。
  • LOCATION: 接続とターゲット インスタンスのロケーション。
  • CONNECTION_ID: BigQuery 接続の名前。
  • CLUSTER_ID: AlloyDB クラスタの名前。
  • INSTANCE_ID: ターゲット AlloyDB インスタンスの名前。
  • SCHEMA_NAME(省略可): AlloyDB の宛先スキーマの名前。指定しない場合は、データベース ユーザーに構成されたデフォルトのスキーマが使用されます。
  • TABLE_NAME: AlloyDB の既存の宛先テーブルの名前(スキーマ接頭辞なし)。
  • MAX_CONNECTIONS(省略可): BigQuery ワーカーから AlloyDB インスタンスへの同時並列接続の最大数。接続を制限すると、大規模なエクスポート中にターゲット インスタンスが過負荷になるのを防ぐことができます。

データのエクスポート

EXPORT DATA ステートメントを使用して、BigQuery テーブルから AlloyDB テーブルにデータをエクスポートできます。

次の例では、mydataset.table1 という名前のテーブルから選択したフィールドを、my_target_table という名前の AlloyDB テーブルにエクスポートします。

EXPORT DATA
  WITH CONNECTION `myproject.us-central1.my-alloydb-conn`
  OPTIONS (
    format='ALLOYDB',
    uri="https://alloydb.googleapis.com/v1/projects/myproject/locations/us-central1/clusters/my-cluster/instances/my-instance",
    alloydb_options="""{
      "schema": "public",
      "table": "my_target_table"
    }"""
  )
AS SELECT
  col1 AS id,
  col2 AS name,
  col3 AS value
FROM
  `mydataset.table1`;

料金

EXPORT DATA ステートメントを使用して AlloyDB にデータをエクスポートする場合は、BigQuery 容量コンピューティングの料金が適用されます。

データのエクスポート後、AlloyDB にデータを保存すると料金が発生します。詳細については、AlloyDB for PostgreSQL の料金をご覧ください。