AlloyDB にデータをエクスポートする(リバース ETL)
このドキュメントでは、BigQuery から AlloyDB for PostgreSQL への逆方向の抽出、変換、読み込み(リバース ETL)ワークフローを設定する方法について説明します。これを行うには、EXPORT DATA ステートメントを使用します。
始める前に
エクスポートされたデータを受け取る AlloyDB クラスタとインスタンス(データベース、スキーマ、テーブルを含む)を作成します。エクスポート ジョブを実行する前に、ターゲット スキーマとテーブルが必要です。
ターゲット AlloyDB インスタンスは、
READY状態のPRIMARYインスタンスである必要があります。BigQuery 接続を作成して、AlloyDB インスタンスに接続します。接続はユーザー名とパスワードで認証されている必要があります。接続で指定されたデータベース ユーザーには、ターゲット テーブルに対する
INSERT権限と、ターゲット スキーマに対するUSAGE権限が必要です。このドキュメントの各タスクを実行するために必要な権限をユーザーに与える 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 接続を介したユーザー名とパスワードの認証のみがサポートされています。
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 データセットとまったく同じ 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 の料金をご覧ください。