將資料匯出至 AlloyDB (反向 ETL)
本文說明如何設定從 BigQuery 到 AlloyDB for PostgreSQL 的反向擷取、轉換及載入 (反向 ETL) 工作流程。您可以使用 EXPORT DATA 陳述式執行這項操作。
您也可以將 BigQuery 資料表同步至 AlloyDB,藉此將資料匯出至 AlloyDB。
事前準備
建立 AlloyDB 叢集和執行個體 (包括資料庫、結構定義和資料表),接收匯出的資料。執行匯出作業前,您必須擁有目標結構定義和資料表。
目標 AlloyDB 執行個體必須是
PRIMARY執行個體,且處於READY狀態。建立 BigQuery 連線,連線至 AlloyDB 執行個體。連線必須透過使用者名稱和密碼進行驗證。連線中指定的資料庫使用者必須具備目標資料表的
INSERT權限和目標結構定義的USAGE權限。如要使用這項功能,請建立 BigQuery Enterprise 或 Enterprise Plus 層級預留空間。只有
QUERY已指派的預留項目,才能匯出至 AlloyDB。授予 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限制。匯出工作不會執行「新增或更新」作業,也就是說,如果存在相符的唯一鍵,系統不會更新現有記錄。如有任何傳入的資料列違反PRIMARY KEY或UNIQUE限制,整個匯出工作就會失敗。我們不建議對同一個 AlloyDB 表格執行多個並行
EXPORT DATA工作。否則可能會導致無法預測的行為,例如資料遺失或工作失敗。建議您確認一次只有一個匯出工作會寫入特定資料表。系統僅支援透過 BigQuery 連線進行使用者名稱和密碼驗證。
不支援
ARRAY、BYTES、GEOGRAPHY、INTERVAL和STRUCTBigQuery 資料類型。如果 BigQuery
SELECT陳述式省略目標 AlloyDB 資料表中存在的資料欄,這些資料欄必須允許NULL值,或在 AlloyDB 中定義預設值。如果這些欄位有NOT NULL限制,且沒有預設值,匯出作業就會失敗。只有 BigQuery Enterprise 或 Enterprise Plus 版本支援匯出至 AlloyDB。不支援 BigQuery Standard 版和隨選運算。詳情請參閱「管理功能」。
BigQuery 工作 (例如擷取至 AlloyDB 的工作) 最長可執行 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`;
同步處理要匯出的資料表
如要複製整個資料表或自動鏡像處理,不必使用 SQL 轉換,可以直接將 BigQuery 資料表同步至 AlloyDB。EXPORT DATA 陳述式可讓您在移動資料前,使用 SELECT 查詢處理、別名或篩選資料,但您可以使用資料表同步功能,將 BigQuery 資料表一對一移轉。
表格同步功能支援下列模式:
- 一次性匯入:在 AlloyDB 中建立 BigQuery 資料表的可寫入獨立副本。
- 定期同步 (鏡像):在 AlloyDB 中建立唯讀本機資料表,並按照定義的時間表自動從 BigQuery 重新整理。
詳情請參閱將 BigQuery 資料同步至 AlloyDB。
定價
使用 EXPORT DATA 陳述式將資料匯出至 AlloyDB 時,系統會按照 BigQuery 容量運算定價計費。
匯出資料之後,系統會因您在 AlloyDB 中儲存資料而向您收取費用。詳情請參閱 AlloyDB for PostgreSQL 定價。