匯出及匯入資料

您可以使用 Cloud Firestore 代管的匯出與匯入服務,復原意外刪除的資料,以及匯出資料進行離線處理。您可以匯出所有文件或特定集合。同樣地,您也可以從特定匯出項目匯入所有資料,或只匯入特定集合。從 Cloud Firestore 資料庫匯出的資料可以匯入另一個 Cloud Firestore 資料庫。您也可以將 Cloud Firestore 匯出內容載入 BigQuery

本頁面說明如何使用 Cloud Storage 匯出及匯入 Cloud Firestore 文件。您可以透過 gcloud 指令列工具和 Cloud Firestore API (RESTRPC) 使用 Cloud Firestore 代管匯出與匯入服務。

事前準備

您必須先完成下列步驟,才能使用代管匯出與匯入服務:

  1. 啟用 Google Cloud 專案的計費功能。只有已啟用計費功能的 Google Cloud 專案才能使用匯出與匯入功能。
  2. Cloud Firestore 資料庫位置附近的位置,為專案建立 Cloud Storage 值區。匯出與匯入作業不能使用要求者付費值區。
  3. 請確認您的帳戶具備 Cloud Firestore 和 Cloud Storage 的必要權限。如果您是專案擁有者,您的帳戶具備必要的權限。否則,下列角色可授予匯出和匯入作業的必要權限,以及 Cloud Storage 的存取權:

服務代理權限

匯出和匯入作業會使用 Cloud Firestore 服務代理來授權 Cloud Storage 作業。Cloud Firestore 服務代理使用下列命名慣例:

Cloud Firestore 服務代理
service-PROJECT_NUMBER@gcp-sa-firestore.iam.gserviceaccount.com

如要進一步瞭解服務代理,請參閱服務代理

Cloud Firestore 服務代理需要存取匯出或匯入作業中使用的 Cloud Storage 值區。根據預設,如果您的 Cloud Storage 值區與 Cloud Firestore 資料庫位於相同專案中,則 Cloud Firestore 服務代理預設可以存取值區

如果 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 服務代理命名。如要查看服務代理名稱,請參閱「查看服務代理名稱」一節。

或者也可以使用 GCP Console 指派此角色

查看服務代理名稱

在 Google Cloud Platform Console 的匯入/匯出頁面中,您可以查看匯入和匯出作業用來授權要求的帳戶。您也可以查看資料庫使用的是 Cloud Firestore 服務代理還是舊版 App Engine 服務帳戶。

  1. 查看「匯入/匯出工作執行身分」標籤旁的授權帳戶。

服務代理需要 Cloud Storage 值區的 Storage Admin 角色,才能用於匯出或匯入作業。

為專案設定 gcloud

您可以透過 Google Cloud Platform Console 或 gcloud 指令列工具啟動匯入和匯出作業。如要使用 gcloud,請透過下列其中一種方式設定指令列工具並連線至您的專案:

匯出資料

匯出作業會將資料庫中的文件複製到 Cloud Storage 值區中的一組檔案。請注意,匯出作業並非在匯出開始時間時的確切資料庫快照。匯出項目可能包含在作業執行期間所做的變更。

匯出所有文件

Google Cloud 控制台

  1. 在 Google Cloud Platform Console 中,前往「Databases」頁面。

    前往「資料庫」頁面

  2. 從資料庫清單中選取所需的資料庫。

  3. 在導覽選單中,按一下「Import/Export」(匯入/匯出)

  4. 按一下 [匯出]

  5. 按一下「Export full database」(匯出整個資料庫) 選項。

  6. 在「Choose Destination」下方,輸入 Cloud Storage 值區名稱,或使用「Browse」按鈕選取值區。

  7. 按一下 [匯出]

主控台會回到「Import/Export」頁面。如果作業成功啟動,頁面就會在最近的匯入與匯出頁面新增項目。失敗時,頁面會顯示錯誤訊息。

gcloud

使用 firestore export 指令匯出資料庫中的所有文件 (請將 [BUCKET_NAME] 替換成您的 Cloud Storage 值區名稱)。新增 --async 標記,防止 gcloud 工具等待作業完成。

  gcloud firestore export gs://[BUCKET_NAME] \
  --database=[DATABASE]

更改下列內容:

  • BUCKET_NAME:在值區名稱後方加上檔案前置字串 (例如 BUCKET_NAME/my-exports-folder/export-name),即可整理匯出項目。如果您未提供檔案前置字串,代管匯出服務會根據目前的時間戳記建立前置字串。

  • DATABASE:您要匯出文件的來源資料庫名稱。如果是預設資料庫,請使用 --database='(default)'

啟動匯出作業後,關閉終端機並不會取消作業,請參閱取消作業

匯出特定集合

Google Cloud 控制台

  1. 在 Google Cloud Platform Console 中,前往「Databases」頁面。

    前往「資料庫」頁面

  2. 從資料庫清單中選取所需的資料庫。

  3. 在導覽選單中,按一下「Import/Export」(匯入/匯出)

  4. 按一下 [匯出]

  5. 按一下「匯出一或多個集合群組」選項。您可以使用下拉式選單選取一或多個集合群組。

  6. 在「Choose Destination」下方,輸入 Cloud Storage 值區名稱,或使用「Browse」按鈕選取值區。

  7. 按一下 [匯出]

主控台會回到「Import/Export」頁面。如果作業成功啟動,頁面就會在最近的匯入與匯出頁面新增項目。失敗時,頁面會顯示錯誤訊息。

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 集合,內含多個子集合,例如 ratingsreviewsoutlets。如要匯出特定集合 restaurantsreviews,指令如下所示:

gcloud firestore export gs://[BUCKET_NAME] \
--collection-ids=restaurants,reviews \
--database='cymbal'

從時間點復原 (PITR) 時間戳記匯出

您可以使用 gcloud firestore export 指令,從 PITR 資料將資料庫匯出至 Cloud Storage。您可以匯出時間點復原資料,其中時間戳記是過去七天內 (但不得早於 earliestVersionTime) 的整分鐘時間戳記。如果資料不再以指定的時間戳記出現,匯出作業就會失敗。

PITR 匯出作業支援所有篩選器,包括匯出所有文件以及匯出特定集合。

  1. 匯出資料庫,並將 snapshot-time 參數指定至所需的復原時間戳記。

    gcloud

    執行下列指令,將資料庫匯出至您的值區。

    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

    匯出時間點復原資料前,請注意下列事項:

    • 請以 RFC 3339 格式指定時間戳記。例如 2020-09-01T23:59:30.234233Z
    • 請確認您指定的時間戳記是過去七天內的整分鐘時間戳記,但並非早於 earliestVersionTime。如果資料不再存在於指定的時間戳記,就會產生錯誤。
    • 系統不會向您收取時間點復原匯出失敗的費用。

匯入資料

將檔案匯出至 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 控制台

  1. 在 Google Cloud Platform Console 中,前往「Databases」頁面。

    前往「資料庫」頁面

  2. 從資料庫清單中選取所需的資料庫。

  3. 在導覽選單中,按一下「Import/Export」(匯入/匯出)

  4. 按一下「匯入」

  5. 在「Filename」欄位中,輸入完成匯出作業的 .overall_export_metadata 檔案名稱。您可以使用「Browse」(瀏覽) 按鈕選取檔案。

  6. 按一下「匯入」

主控台會回到「Import/Export」頁面。如果作業成功啟動,頁面就會在最近的匯入與匯出頁面新增項目。失敗時,頁面會顯示錯誤訊息。

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 Platform Console 的 Cloud Storage 瀏覽器中確認匯出檔案的位置:

開啟 Cloud Storage 瀏覽器

開始匯入作業後,關閉終端機並不會取消作業,請參閱取消作業

匯入特定集合

Google Cloud 控制台

您無法在控制台中選取特定集合。請改用 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

不過,您可以在為 describecanceldelete 指令指定作業名稱時,省略前置字串。

列出所有匯出和匯入作業

Google Cloud 控制台

您可以在 Google Cloud Platform Console 的「Import/Export」(匯入/匯出) 頁面中,查看最近的匯出和匯入作業清單。

  1. 在 Google Cloud Platform Console 中,前往「Databases」頁面。

    前往「資料庫」頁面

  2. 從資料庫清單中選取所需的資料庫。

  3. 在導覽選單中,按一下「Import/Export」(匯入/匯出)

gcloud

使用 operations list 指令查看所有執行中和最近完成的匯出和匯入作業:

gcloud firestore operations list

檢查作業狀態

Google Cloud 控制台

您可以在 Google Cloud Platform Console 的「Import/Export」(匯入/匯出) 頁面中,查看最近的匯出或匯入作業狀態。

  1. 在 Google Cloud Platform Console 中,前往「Databases」頁面。

    前往「資料庫」頁面

  2. 從資料庫清單中選取所需的資料庫。

  3. 在導覽選單中,按一下「Import/Export」(匯入/匯出)

gcloud

使用 operations describe 指令顯示匯出或匯入作業的狀態。

gcloud firestore operations describe [OPERATION_NAME]

預估完成時間

有關長時間執行作業狀態的要求,會傳回 workEstimatedworkCompleted 指標。每個指標都會以位元組數和實體數傳回:

  • workEstimated 會顯示預估作業將處理的位元組總數和文件。如果 Cloud Firestore 無法進行預估,可能會省略這項指標。

  • workCompleted 會顯示目前已處理的位元組數和文件數量。作業完成後,值會顯示實際處理的位元組總數和文件總數,可能會大於 workEstimated 的值。

workCompleted 除以 workEstimated 可得出進度的粗估值。這個預估結果可能不準確,因為這取決於延遲統計資料的收集作業。

取消作業

Google Cloud 控制台

如要取消正在執行的匯出或匯入作業,請前往 Google Cloud Platform Console 的「Import/Export」(匯入/匯出) 頁面。

  1. 在 Google Cloud Platform Console 中,前往「Databases」頁面。

    前往「資料庫」頁面

  2. 從資料庫清單中選取所需的資料庫。

  3. 在導覽選單中,按一下「Import/Export」(匯入/匯出)

在「Recent imports and exports」(近期匯入及匯出) 表格中,目前執行中的作業會在「Completed」(已完成) 資料欄顯示「Cancel」(取消) 按鈕。按一下「Cancel」(取消) 按鈕即可停止作業。作業完全停止時,按鈕會變更為「Cancelling」訊息,然後變更為「Cancelled」

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 Billing 報表頁面中使用這個標籤查看匯入和匯出作業的相關費用:

從篩選器選單中存取 goog-firestore 管理的標籤。

匯出至 BigQuery

只有在指定 collection-ids 篩選器的情況下,您才可以從 Cloud Firestore 匯出檔案載入 BigQuery 中的資料。請參閱從 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 Platform Console 的匯入/匯出頁面中,查看匯入和匯出作業使用哪個帳戶授權要求。您也可以查看資料庫是否已使用 Cloud Firestore 服務代理。

  1. 在 Google Cloud Platform Console 中,前往「Databases」頁面。

    前往「資料庫」頁面

  2. 從資料庫清單中選取所需的資料庫。
  3. 在導覽選單中,按一下「Import/Export」(匯入/匯出)

  4. 查看「匯入/匯出工作執行身分」標籤旁的授權帳戶。

如果您的專案未使用 Cloud Firestore 服務代理,您可以使用下列任一技術遷移至 Cloud Firestore 服務代理:

第一種技術是建議使用的,因為這種技術可將效果範圍本地化至單一 Cloud Firestore 專案。不建議採用第二種技術,因為這種方式不會遷移現有的 Cloud Storage 值區權限。但可在機構層級提供安全法規遵循。

檢查及更新 Cloud Storage 值區權限進行遷移

遷移程序有兩個步驟:

  1. 更新 Cloud Storage 值區權限。詳情請參閱下節。
  2. 確認遷移至 Cloud Firestore 服務代理。

服務代理值區權限

針對在「其他」專案中使用 Cloud Storage 值區的任何匯出或匯入作業,您必須授予該值區的 Cloud Firestore 服務代理權限。舉例來說,將資料移至其他專案的作業需要存取該專案中的值區。否則,在遷移至 Cloud Firestore 服務代理後,這些作業會失敗。

保留相同專案的匯入及匯出工作流程不需要變更權限。根據預設,Cloud Firestore 服務代理可存取相同專案中的值區。

更新其他專案中的 Cloud Storage 值區權限,以授予 service-PROJECT_NUMBER@gcp-sa-firestore.iam.gserviceaccount.com 服務代理的存取權。將 Firestore Service Agent 角色授予服務代理。

Firestore Service Agent 角色可授予 Cloud Storage 值區的讀取和寫入權限,如果只想授予讀取或寫入權限,請使用自訂角色

下一節所述的遷移程序可協助您找出可能需要更新權限的 Cloud Storage 值區。

將專案遷移至 Firestore 服務代理

請完成下列步驟,從 App Engine 服務帳戶遷移至 Cloud Firestore 服務代理。遷移作業一旦完成,就無法復原。

  1. 在 Google Cloud Platform Console 中,前往「Databases」頁面。

    前往「資料庫」頁面

  2. 從資料庫清單中選取所需的資料庫。
  3. 在導覽選單中,按一下「Import/Export」(匯入/匯出)

  4. 如果您的專案尚未遷移至 Cloud Firestore 服務代理,您會看到遷移說明的橫幅和「查看值區狀態」按鈕。下一步將協助您找出並修正潛在的權限錯誤。

    點選「檢查值區狀態」

    系統隨即會顯示選單,提供完成遷移作業的選項和 Cloud Storage 值區清單。清單可能需要幾分鐘才能載入完成。

    這份清單包含最近曾用於匯入和匯出作業的值區,但目前並未將讀取和寫入權限授予 Cloud Firestore 服務代理。

  5. 請記下專案的 Cloud Firestore 服務代理主體名稱,服務代理名稱會出現在「服務代理要授予存取權」標籤下方。
  6. 針對清單中要用於未來匯入或匯出作業的所有值區,完成下列步驟:

    1. 在這個值區的資料表列中,按一下「修正」。系統會在新分頁中開啟該值區的權限頁面。

    2. 按一下「新增」。
    3. 在「新增主體」欄位中,輸入 Cloud Firestore 服務代理的名稱。
    4. 在「請選擇角色」欄位中,依序選取「服務代理」>「Firestore 服務代理」
    5. 點選「Save」
    6. 返回「Cloud Firestore 匯入/匯出」頁面。
    7. 針對清單中的其他值區重複上述步驟。請務必查看清單的所有頁面。
  7. 按一下「遷移至 Firestore 服務代理」。如果值區仍有無法檢查的權限檢查作業,請點選「遷移」來確認遷移作業。

    遷移完成時,您會收到通知。遷移作業無法復原。

查看遷移狀態

如何驗證專案的遷移狀態:

  1. 在 Google Cloud Platform Console 中,前往「Databases」頁面。

    前往「資料庫」頁面

  2. 從資料庫清單中選取所需的資料庫。
  3. 在導覽選單中,按一下「Import/Export」(匯入/匯出)

  4. 在「匯入/匯出工作執行身分」標籤旁邊找出主體。

    如果主體為 service-PROJECT_NUMBER@gcp-sa-firestore.iam.gserviceaccount.com,表示專案已遷移至 Cloud Firestore 服務代理。遷移作業無法復原。

    如果專案尚未遷移,頁面頂端會顯示橫幅,並顯示「Check Bucket Status」(檢查值區狀態) 按鈕。如要完成遷移作業,請參閱「遷移至 Firestore 服務代理」一文。

新增整個機構的政策限制

  • 在貴機構的政策中設定下列限制:

    必須使用 Firestore 服務代理來執行匯入/匯出作業 (firestore.requireP4SAforImportExport)。

    這項限制需要匯入和匯出作業,才能透過 Cloud Firestore 服務代理授權要求。如要設定這項限制,請參閱「 建立及管理機構政策 」。

套用這項機構政策限制並不會自動為 Cloud Firestore 服務代理授予適當的 Cloud Storage 值區權限。

如果限制會在任何匯入或匯出工作流程產生權限錯誤,您可以停用這項功能,改回使用預設服務帳戶。檢查及更新 Cloud Storage 值區權限後,您可以再次啟用限制。