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