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

BigQuery から AlloyDB for PostgreSQL へのリバース抽出、変換、読み込み(リバース ETL)ワークフローを使用すると、BigQuery から AlloyDB データベースにデータを移動できます。EXPORT DATA ステートメントを使用して、エクスポートする前にクエリでデータを処理またはフィルタリングできます。また、BigQuery テーブルを AlloyDB に同期して、テーブル全体をコピーまたはミラーリングすることもできます。

始める前に

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

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

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

  • この機能を使用するには、BigQuery Enterprise または Enterprise Plus ティアの予約を作成する必要があります。AlloyDB へのエクスポートは、QUERY の割り当てがある予約でのみサポートされます。

  • このドキュメントの各タスクを実行するために必要な権限をユーザーに与える 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」を実行しません。upsert では、一意の一致するキーがある場合に既存のレコードが更新されます。受信行が PRIMARY KEY または UNIQUE 制約に違反している場合、エクスポート ジョブ全体が失敗します。

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

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

  • ARRAY、BYTES、GEOGRAPHY、INTERVAL、STRUCT の BigQuery データ型はサポートされていません。

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

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

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

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

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

  • 同じリージョンへのエクスポート: ターゲット AlloyDB インスタンスは、BigQuery データセットとまったく同じ Cloud de Confiance by S3NS リージョンに存在する必要があります。たとえば、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: Cloud de Confiance by S3NS プロジェクトの名前。
  • 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`;

エクスポート用にテーブルを同期する

SQL ベースの変換を必要とせずにテーブル全体をコピーする場合や、自動ミラーリングを行う場合は、BigQuery テーブルを AlloyDB に直接同期できます。EXPORT DATA ステートメントを使用すると、SELECT クエリを使用して、データを移動する前に処理、エイリアス、フィルタリングを行うことができます。また、テーブル同期を使用して、BigQuery テーブルを 1 対 1 で移行することもできます。

テーブルの同期は、次のモードで使用できます。

  • 1 回限りのインポート: AlloyDB 内に BigQuery テーブルの書き込み可能な独立したコピーを作成します。
  • 定期的な同期(ミラーリング): AlloyDB に読み取り専用のローカル テーブルを作成し、定義されたスケジュールで BigQuery から自動的に更新します。

詳細については、BigQuery データを AlloyDB に同期するをご覧ください。

料金

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

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