您可以使用Cloud Firestore代管的匯出和匯入服務來復原意外刪除的資料,也能匯出資料,在離線時處理。你可以匯出所有文件,或只匯出特定集合。同樣地,你也能匯入某個匯出項目中的所有資料,或只匯入特定集合。從一個 Cloud Firestore 資料庫匯出的資料可以匯入到另一個 Cloud Firestore 資料庫。您也可以將匯出內容載入 BigQuery。Cloud Firestore
本頁說明如何使用匯出與匯入代管服務和 Cloud Storage 匯出及匯入 Cloud Firestore 文件。透過 gcloud
指令列工具和 Cloud Firestore API (REST、RPC),可使用匯出與匯入代管服務。Cloud Firestore
事前準備
您必須先完成下列步驟,才能使用匯出與匯入代管服務:
- 為 Google Cloud 專案啟用計費功能。只有啟用計費功能的 Google Cloud 專案才能使用匯出與匯入功能。
- 在資料庫位置附近的位置,為專案建立 Cloud Storage bucket。Cloud Firestore匯出與匯入作業不適用於要求者付費值區。
-
請確認帳戶具備 Cloud Firestore 和 Cloud Storage 的必要權限。如果您是專案擁有者,您的帳戶必須擁有必要權限。否則,下列角色會授予匯出和匯入作業,以及存取 Cloud Storage 的必要權限:
- Cloud Firestore 角色:
Owner
、Cloud Datastore Owner
或Cloud Datastore Import Export Admin
Cloud Storage 角色:
Owner
或Storage Admin
- Cloud Firestore 角色:
服務代理權限
匯出和匯入作業會使用 Cloud Firestore 服務代理程式授權 Cloud Storage 作業。Cloud Firestore 服務代理程式採用下列命名慣例:
- Cloud Firestore 服務代理
service-PROJECT_NUMBER@gcp-sa-firestore.iam.gserviceaccount.com
如要進一步瞭解服務代理人,請參閱「服務代理人」。
Cloud Firestore 服務代理需要存取匯出或匯入作業所用的 Cloud Storage 值區。根據預設,如果您的 Cloud Storage bucket 與 Cloud Firestore 資料庫皆屬同一個專案,Cloud Firestore 服務代理程式即可存取該 bucket。
如果 Cloud Storage 值區位於其他專案,則必須授予 Cloud Firestore 服務代理程式對 Cloud Storage 值區的存取權。
指派角色給服務代理
您可以使用 gsutil 指令列工具指派下列其中一種角色。例如,要將「Storage 管理員」角色指派給 Cloud Firestore 服務代理程式,請執行下列指令:
gsutil iam ch serviceAccount:service-PROJECT_NUMBER@gcp-sa-firestore.iam.gserviceaccount.com:roles/storage.admin \ gs://[BUCKET_NAME]
將 PROJECT_NUMBER
換成專案編號,這會用於命名 Cloud Firestore 服務代理程式。如要查看服務代理名稱,請參閱「查看服務代理名稱」。
或者,您也可以使用 Google Cloud 控制台指派此角色。
查看服務代理名稱
如要查看匯入和匯出作業用來授權要求的帳戶,請前往 Google Cloud 控制台的「匯入/匯出」頁面。您也可以查看資料庫是否使用Cloud Firestore服務代理程式或舊版App Engine服務帳戶。
- 查看「匯入/匯出工作的執行身分」標籤旁的授權帳戶。
服務代理需要 Cloud Storage 值區的 Storage Admin
角色,才能執行匯出或匯入作業。
為專案設定 gcloud
您可以透過 Google Cloud 控制台或 gcloud
指令列工具啟動匯入和匯出作業。如要使用 gcloud
,請設定指令列工具,並透過下列其中一種方式連線至專案:
使用 Cloud Shell,從 Google Cloud Platform 主控台存取
gcloud
。確保將
gcloud
設定為正確的專案:gcloud config set project [PROJECT_ID]
匯出資料
匯出作業會將資料庫中的文件複製到 Cloud Storage 值區的一組檔案中。請注意,匯出作業並非在匯出開始時擷取的資料庫快照。匯出內容可能包含作業執行期間所做的變更。
匯出所有文件
Google Cloud Console
前往 Google Cloud 控制台的「資料庫」頁面。
從資料庫清單中選取所需資料庫。
按一下導覽選單中的「匯入/匯出」。
按一下 [匯出]。
按一下「匯出整個資料庫」選項。
在「選擇目的地」下方,輸入 Cloud Storage bucket 的名稱,或使用「瀏覽」按鈕選取 bucket。
按一下 [匯出]。
控制台會返回「匯入/匯出」頁面。如果作業順利開始,頁面會將項目新增至「近期匯入和匯出」頁面。如果失敗,頁面會顯示錯誤訊息。
gcloud
使用 firestore export
指令匯出資料庫中的所有文件,並將 [BUCKET_NAME]
替換為 Cloud Storage 值區的名稱。加上 --async
旗標,避免 gcloud
工具為了等待作業完成而停頓。
gcloud firestore export gs://[BUCKET_NAME] \ --database=[DATABASE]
更改下列內容:
BUCKET_NAME
:在 bucket 名稱後方新增檔案前置字串,即可整理匯出內容,例如BUCKET_NAME/my-exports-folder/export-name
。如未提供檔案前置字串,代管匯出服務會根據目前的時間戳記建立前置字串。DATABASE
:要匯出文件的資料庫名稱。如要使用預設資料庫,請使用--database='(default)'
。
匯出作業開始後,關閉終端機不會取消作業,請參閱「取消作業」。
匯出特定集合
Google Cloud Console
前往 Google Cloud 控制台的「資料庫」頁面。
從資料庫清單中選取所需資料庫。
按一下導覽選單中的「匯入/匯出」。
按一下 [匯出]。
按一下「匯出一或多個集合群組」選項。使用下拉式選單選取一或多個集合群組。
在「選擇目的地」下方,輸入 Cloud Storage bucket 的名稱,或使用「瀏覽」按鈕選取 bucket。
按一下 [匯出]。
控制台會返回「匯入/匯出」頁面。如果作業順利開始,頁面會將項目新增至「近期匯入和匯出」頁面。如果失敗,頁面會顯示錯誤訊息。
gcloud
如要匯出特定集合群組,請使用 --collection-ids
標記。這項作業只會匯出具有指定集合 ID 的集合群組。集合群組包含所有集合和子集合 (位於任何路徑),且這些集合和子集合的集合 ID 相同。
gcloud firestore export gs://[BUCKET_NAME] \ --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2],[SUBCOLLECTION_ID_1] \ --database=[DATABASE]
舉例來說,您可以在 foo
資料庫中設計 restaurants
集合,納入多個子集合,例如 ratings
、reviews
或 outlets
。如要匯出特定集合 restaurants
和 reviews
,指令如下所示:
gcloud firestore export gs://[BUCKET_NAME] \ --collection-ids=restaurants,reviews \ --database='cymbal'
從 PITR 時間戳記匯出
您可以從 PITR 資料將資料庫匯出至 Cloud Storage。您可以匯出時間戳記為過去七天內整分鐘的時間點復原資料,但不得早於 earliestVersionTime
。如果指定時間戳記的資料已不存在,匯出作業就會失敗。
PITR 匯出作業支援所有篩選條件,包括匯出所有文件和匯出特定集合。
匯出 PITR 資料前,請注意下列事項:
- 請以 RFC 3339 格式指定時間戳記。例如:
2023-05-26T10:20:00.00Z
。 - 請確認指定的時間戳記是過去七天內的整分時間戳記,但不得早於
earliestVersionTime
。如果指定時間戳記的資料已不存在,系統會產生錯誤。 - 如果 PITR 匯出作業失敗,您不需付費。
控制台
-
前往 Google Cloud 控制台的「資料庫」頁面。
前往「資料庫」 - 從資料庫清單中選取資料庫。
- 按一下導覽選單中的「匯入/匯出」。
- 按一下 [匯出]。
- 設定匯出來源,匯出整個資料庫或僅匯出特定集合。
在「選擇要匯出的資料庫狀態」部分,選取「從較早的時間點匯出」。
選取要用於匯出的快照時間
- 在「Destination」(目的地) 專區中,輸入 Cloud Storage 值區的名稱,或使用「Browse」(瀏覽) 按鈕選取值區。
-
按一下 [匯出]。
控制台會返回「匯入/匯出」頁面。如果作業順利開始,頁面會將項目新增至「近期匯入和匯出」頁面。如果失敗,頁面會顯示錯誤訊息。
gcloud
您可以使用 gcloud firestore export
指令,將資料庫從 PITR 資料匯出至 Cloud Storage。
匯出資料庫,並將 snapshot-time
參數指定為復原時間戳記。執行下列指令,將資料庫匯出至 bucket。
gcloud firestore export gs://[BUCKET_NAME_PATH] \ --snapshot-time=[PITR_TIMESTAMP]
其中 PITR_TIMESTAMP
是精細程度為分鐘的 PITR 時間戳記,例如 2023-05-26T10:20:00.00Z
。
新增 --collection-ids
旗標,匯出特定集合。
匯入資料
將檔案匯出至 Cloud Storage 後,即可將這些檔案中的文件匯入專案或另一個專案。請注意下列匯入作業事項:
匯入資料時,系統會使用資料庫現行的索引定義更新必要索引。匯出項目不包含索引定義。
匯入項目不會指派新的文件 ID。匯入會使用匯出時擷取的 ID。匯入文件時,系統會保留其 ID,避免 ID 衝突。如果已有 ID 相同的文件,匯入作業會覆寫現有文件。
如果資料庫中的文件沒有受到匯入影響,則匯入後將會保留在資料庫中。
匯入作業不會觸發 Cloud Functions。快照監聽器會收到與匯入作業相關的更新。
.overall_export_metadata
檔案名稱必須與父項資料夾的名稱相符:gs://BUCKET_NAME/OPTIONAL_NAMESPACE_PATH/PARENT_FOLDER_NAME/PARENT_FOLDER_NAME.overall_export_metadata
如果移動或複製匯出檔案,請保持 PARENT_FOLDER_NAME 和
.overall_export_metadata
檔案名稱相同。
從匯出內容匯入所有文件
Google Cloud Console
前往 Google Cloud 控制台的「資料庫」頁面。
從資料庫清單中選取所需資料庫。
按一下導覽選單中的「匯入/匯出」。
按一下「匯入」。
在「Filename」(檔案名稱) 欄位中,輸入已完成匯出作業的
.overall_export_metadata
檔案名稱。你可以使用「瀏覽」按鈕選取檔案。按一下「匯入」。
控制台會返回「匯入/匯出」頁面。如果作業順利開始,頁面會將項目新增至「近期匯入和匯出」頁面。如果失敗,頁面會顯示錯誤訊息。
gcloud
使用 firestore import
指令,從先前的匯出作業匯入文件。
gcloud firestore import gs://[BUCKET_NAME]/[EXPORT_PREFIX]/ --database=[DATABASE]
更改下列內容:
BUCKET_NAME/EXPORT_PREFIX
:匯出檔案的位置。DATABASE
:資料庫名稱。如要使用預設資料庫,請使用--database='(default)'
。
例如:
gcloud firestore import gs://my-bucket/2017-05-25T23:54:39_76544/ --database='cymbal'
您可以在 Google Cloud 控制台的Cloud Storage瀏覽器中,確認匯出檔案的位置:
開始匯入作業後,關閉終端機不會取消作業,請參閱取消作業。
匯入特定集合
Google Cloud Console
您無法在控制台中選取特定集合。請改用 gcloud
。
gcloud
如要從一組匯出檔案匯入特定集合群組,請使用 --collection-ids
標記。這項作業只會匯入具有指定集合 ID 的集合群組。集合群組包含所有集合和子集合 (位於任何路徑),且具有指定的集合 ID。使用 --database
旗標指定資料庫名稱。如要使用預設資料庫,請使用 --database='(default)'
。
只有匯出特定集合群組時,才能匯入特定集合群組。您無法從所有文件的匯出項目中,匯入特定集合。
gcloud firestore import gs://[BUCKET_NAME]/[EXPORT_PREFIX]/ \ --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2],[SUBCOLLECTION_ID_1] \ --database=[DATABASE]
匯入 PITR 匯出內容
按照「匯入所有文件」一節中的步驟,匯入匯出的資料庫。如果資料庫中已有任何文件,系統會覆寫這些文件。
管理匯出和匯入作業
開始進行匯出或匯入作業後,Cloud Firestore 會為作業指派專屬名稱。您可以使用作業名稱刪除、取消或檢查作業狀態。
作業名稱的前置字串為 projects/[PROJECT_ID]/databases/(default)/operations/
,例如:
projects/my-project/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
不過,為 describe
、cancel
和 delete
指令指定作業名稱時,可以省略前置字串。
列出所有匯出和匯入作業
Google Cloud Console
您可以在 Google Cloud 控制台的「匯入/匯出」頁面中,查看最近的匯出和匯入作業清單。
前往 Google Cloud 控制台的「資料庫」頁面。
從資料庫清單中選取所需資料庫。
按一下導覽選單中的「匯入/匯出」。
gcloud
使用 operations list
指令查看所有執行中和最近完成的匯出及匯入作業:
gcloud firestore operations list
檢查作業狀態
Google Cloud Console
您可以在 Google Cloud 控制台的「匯入/匯出」頁面中,查看最近匯出或匯入作業的狀態。
前往 Google Cloud 控制台的「資料庫」頁面。
從資料庫清單中選取所需資料庫。
按一下導覽選單中的「匯入/匯出」。
gcloud
使用 operations describe
指令顯示匯出或匯入作業的狀態。
gcloud firestore operations describe [OPERATION_NAME]
估算完成時間
用於取得長時間執行作業狀態的要求,會傳回 workEstimated
和 workCompleted
指標。每個指標都會以位元組數及實體數回傳:
workEstimated
會顯示作業將要處理的位元組總數和文件總數預估值。如果無法估算,Cloud Firestore 可能會省略這項指標。workCompleted
會顯示目前處理過的位元組數和文件數。 作業完成後,該值會顯示實際處理的位元組總數和文件總數,可能會大於workEstimated
的值。
將 workCompleted
除以 workEstimated
可得出進度的粗估值。此估計可能不準確,因為此取決於延遲的統計資料收集。
取消作業
Google Cloud Console
您可以在 Google Cloud 控制台的「匯入/匯出」頁面中,取消執行中的匯出或匯入作業。
前往 Google Cloud 控制台的「資料庫」頁面。
從資料庫清單中選取所需資料庫。
按一下導覽選單中的「匯入/匯出」。
在「最近的匯入和匯出作業」表格中,目前執行的作業會在「已完成」欄中顯示「取消」按鈕。按一下「取消」按鈕即可停止作業。作業完全停止後,按鈕會先顯示「正在取消」訊息,然後顯示「已取消」。
gcloud
使用 operations cancel
指令停止進行中的作業:
gcloud firestore operations cancel [OPERATION_NAME]
取消正在執行的作業不會復原作業。取消匯出作業後,已匯出的文件仍會保留在 Cloud Storage;取消匯入作業後,資料庫中已更新的內容仍會保留。您無法匯入部分完成的匯出作業。
刪除作業
使用 gcloud firestore operations delete
指令,從近期作業清單中移除作業。這個指令不會從 Cloud Storage 刪除匯出檔案。
gcloud firestore operations delete [OPERATION_NAME]
匯出和匯入作業的計費及定價
使用代管匯出與匯入服務前,您需要先為 Google Cloud 專案啟用計費功能。
系統會依據Cloud Firestore定價中的文件讀取和寫入工作費率表,向您收取匯出與匯入作業的費用。匯出作業會針對匯出的每份文件產生一次讀取作業。匯入作業每匯入一個文件,就會產生一次寫入作業。
儲存在 Cloud Storage 中的輸出檔案,會計入您的 Cloud Storage 資料儲存空間費用。
待匯出或匯入作業完成後,系統才會發出關於Google Cloud預算的提醒。匯出和匯入作業不會影響控制台用量部分顯示的用量。
查看匯出和匯入費用
匯出和匯入作業會將 goog-firestoremanaged:exportimport
標籤套用至計費作業。在 Cloud 帳單報表頁面中,您可以使用這個標籤查看與匯入及匯出作業相關的費用:
匯出至 BigQuery
您可以將 Cloud Firestore 匯出的資料載入 BigQuery,但前提是您已指定 collection-ids
篩選器。請參閱從 Cloud Firestore 匯出檔案載入資料。
BigQuery 欄上限
BigQuery 每個資料表最多只能有 10,000 個欄。Cloud Firestore匯出作業會為每個集合群組產生BigQuery表格結構定義。在這個架構中,集合群組中的每個不重複欄位名稱都會成為架構資料欄。
如果集合群組的 BigQuery 結構定義超過 10,000 個資料欄,Cloud Firestore 匯出作業會將對應欄位視為位元組,盡量不超過資料欄限制。如果轉換後資料欄數量少於 10,000 個,您可以將資料載入 BigQuery,但無法查詢對應欄位中的子欄位。如果資料欄數量仍超過 10,000 個,匯出作業就不會為集合群組產生 BigQuery 結構定義,您也無法將資料載入 BigQuery。
匯出格式和中繼資料檔案
代管匯出項目輸出內容採用 LevelDB 記錄檔格式。
中繼資料檔案
在匯出作業中,會建立每個指定集合群組的中繼資料檔案。中繼資料檔案名稱通常是 ALL_NAMESPACES_KIND_[COLLECTION_GROUP_ID].export_metadata
。
中繼資料檔案為通訊協定緩衝區,可透過 protoc
通訊協定編譯器進行解碼。舉例來說,您可以將中繼資料檔案解碼,判斷匯出檔案中包含的集合群組:
protoc --decode_raw < export0.export_metadata
服務代理人遷移
Cloud Firestore 會使用 Cloud Firestore 服務代理程式授權匯入和匯出作業,而不是使用 App Engine 服務帳戶。服務代理程式和服務帳戶使用下列命名慣例:
- Cloud Firestore 服務代理
service-PROJECT_NUMBER@gcp-sa-firestore.iam.gserviceaccount.com
Cloud Firestore先前使用App Engine預設服務帳戶,而非Cloud Firestore服務代理程式。如果資料庫仍使用 App Engine 服務帳戶匯入或匯出資料,建議按照本節的指示,改用 Cloud Firestore 服務代理程式。
- App Engine 服務帳戶
PROJECT_ID@appspot.gserviceaccount.com
建議使用 Cloud Firestore 服務代理,因為這是 Cloud Firestore 專用的代理。App Engine 服務帳戶由多項服務共用。
不相容。查看授權帳戶
您可以在 Google Cloud 控制台的「匯入/匯出」頁面中,查看匯入和匯出作業授權要求時使用的帳戶。您也可以查看資料庫是否已使用 Cloud Firestore 服務代理程式。
-
前往 Google Cloud 控制台的「資料庫」頁面。
- 從資料庫清單中選取所需資料庫。
-
按一下導覽選單中的「匯入/匯出」。
- 查看「匯入/匯出工作的執行身分」標籤旁的授權帳戶。
如果專案未使用 Cloud Firestore 服務代理,您可以透過下列任一方法遷移至 Cloud Firestore 服務代理:
- 檢查及更新 Cloud Storage bucket 權限,然後遷移專案 (建議採用)。
- 新增機構層級的政策限制,影響機構內的所有專案。
建議使用第一種方法,因為這樣可將影響範圍限制在單一 Cloud Firestore 專案。第二種方法不建議使用,因為不會遷移現有的 Cloud Storage 值區權限。不過,這項服務提供機構層級的安全合規性。
遷移:檢查及更新 Cloud Storage 值區權限
遷移程序分為兩個步驟:
- 更新 Cloud Storage bucket 權限。詳情請參閱下節。
- 確認要轉移至 Cloud Firestore 服務專員。
服務代理 bucket 權限
如要進行匯出或匯入作業,並使用Cloud Storage其他專案中的值區,請務必授予該值區的 Cloud Firestore 服務代理程式權限。舉例來說,將資料移至其他專案的作業,需要存取該專案中的值區。否則,在遷移至 Cloud Firestore 服務代理程式後,這些作業就會失敗。
如果匯入和匯出工作流程都在同一個專案中,就不需要變更權限。根據預設,Cloud Firestore 服務代理可以存取同一個專案中的 buckets。
更新其他專案中 Cloud Storage 值區的權限,授予 service-PROJECT_NUMBER@gcp-sa-firestore.iam.gserviceaccount.com
服務代理存取權。將 Firestore Service Agent
角色授予服務代理。
Firestore Service Agent
角色會授予 Cloud Storage bucket 的讀取和寫入權限。如要只授予讀取或寫入權限,請使用自訂角色。
下一節所述的遷移程序可協助您找出可能需要更新權限的 Cloud Storage bucket。
將專案遷移至 Firestore 服務代理
請完成下列步驟,從 App Engine 服務帳戶遷移至 Cloud Firestore 服務代理商。遷移作業完成後就無法復原。
-
前往 Google Cloud 控制台的「資料庫」頁面。
- 從資料庫清單中選取所需資料庫。
-
按一下導覽選單中的「匯入/匯出」。
-
如果專案尚未遷移至 Cloud Firestore 服務代理程式,您會看到說明遷移作業的橫幅和「檢查 Bucket 狀態」按鈕。下一個步驟將協助您找出並修正潛在的權限錯誤。
按一下「Check Bucket Status」(檢查值區狀態)。
畫面上會顯示選單,提供完成遷移作業的選項和 Cloud Storage 值區清單。清單可能需要幾分鐘才能載入完成。
這份清單包含最近用於匯入和匯出作業的值區,但目前未授予 Cloud Firestore 服務代理人讀取和寫入權限。
- 請記下專案Cloud Firestore服務代理程式的主體名稱。服務代理名稱會顯示在「應授予存取權的服務代理」標籤下方。
-
如要使用清單中的任何水桶進行日後的匯入或匯出作業,請完成下列步驟:
-
在該儲存區的表格列中,按一下「修正」。 系統會在新的分頁中開啟該值區的權限頁面。
- 按一下 [新增]。
- 在「New principals」(新增主體) 欄位中,輸入服務代理人的名稱。Cloud Firestore
- 在「Select a role」(請選擇角色) 欄位中,依序選取「Service Agents」(服務代理人) >「Firestore Service Agent」(Firestore 服務代理人)。
- 按一下 [儲存]。
- 返回「Cloud Firestore 匯入/匯出」頁面的分頁。
- 針對清單中的其他值區重複上述步驟。請務必查看清單的所有頁面。
-
-
按一下「遷移至 Firestore 服務代理人」。如果仍有值區的權限檢查失敗,請按一下「遷移」確認遷移。
遷移作業完成後,系統會發出快訊通知。遷移作業無法復原。
查看遷移狀態
如要確認專案的遷移狀態,請按照下列步驟操作:
-
前往 Google Cloud 控制台的「資料庫」頁面。
- 從資料庫清單中選取所需資料庫。
-
按一下導覽選單中的「匯入/匯出」。
-
在「匯入/匯出工作的執行身分」標籤旁,尋找主體。
如果主體是
service-PROJECT_NUMBER@gcp-sa-firestore.iam.gserviceaccount.com
,表示專案已遷移至 Cloud Firestore 服務代理程式。遷移作業無法復原。如果專案尚未遷移,頁面頂端會顯示橫幅和「檢查 Bucket 狀態」按鈕。請參閱「遷移至 Firestore 服務代理人」一文,完成遷移作業。
新增全機構適用的政策限制
-
在機構政策中設定下列限制:
必須使用 Firestore 服務代理才能執行匯入/匯出工作 (
firestore.requireP4SAforImportExport
)。這項限制規定匯入和匯出作業必須使用 Cloud Firestore 服務代理授權要求。如要設定這項限制,請參閱「 建立及管理機構政策 」。
套用這項機構政策限制時,系統不會自動為 Cloud Firestore 服務代理授予適當的 Cloud Storage bucket 權限。
如果限制導致任何匯入或匯出工作流程發生權限錯誤,您可以停用限制,改回使用預設服務帳戶。檢查並更新 Cloud Storage bucket 權限後,即可再次啟用限制。