在專案之間移動資料

本頁說明如何使用受管理匯入和匯出功能,將 Cloud Firestore 資料從一個專案移至另一個專案。這項功能可用於設定開發環境,或將應用程式永久遷移至其他專案。本頁面的範例說明如何從來源專案匯出資料,然後將資料匯入目的地專案。在專案之間移動資料的步驟如下:

  1. 建立 Cloud Storage bucket,用來存放來源專案的資料。
  2. 將來源專案的資料匯出至值區。
  3. 授予目標專案從值區讀取的權限。
  4. 將 bucket 中的資料匯入目的地專案。

事前準備

如要使用匯出與匯入代管服務,請先完成下列工作:

  1. 為來源專案和目的地專案啟用計費功能。只有已啟用帳單的 Google Cloud 專案才能使用匯出和匯入功能。
  2. 請確認您的帳戶在來源專案和目的地專案中,具備必要的 Cloud IAM 權限。如果您是這兩個專案的擁有者,您的帳戶就具備必要權限。否則,下列 Cloud IAM 角色會授予 Cloud Firestore 匯出和匯入作業的必要權限:

    Owner、Cloud Datastore Owner 或 Cloud Datastore Import Export Admin

    專案擁有者可以按照「授予存取權」一文中的步驟,指派其中一個角色。

  3. 設定 gcloud 指令列工具,並透過下列任一方式連線至專案:

  4. 在新專案中設定索引。來源和目的地專案的複合索引應相符。請先設定索引,避免多次處理每份文件。

從來源專案匯出資料

建立 Cloud Storage bucket 來存放匯出檔案,然後啟動匯出作業,即可匯出資料。Cloud Firestore

建立 Cloud Storage bucket

在與 Cloud Firestore 資料庫相同的位置,建立 Cloud Storage 值區。如要查看資料庫位置,請參閱專案位置設定。您無法使用「要求者付費」值區或快速值區執行匯出和匯入作業。

如果 Cloud Storage 值區不在來源專案中,您必須授予來源專案的預設服務帳戶該值區的存取權。每個 Google Cloud 專案都會自動建立名為 PROJECT_ID@appspot.gserviceaccount.com 的預設服務帳戶。Cloud Firestore 匯出作業會使用這個預設服務帳戶授權 Cloud Storage 儲存空間作業。如要授予預設服務帳戶來源 bucket 的存取權,請將 Storage Admin 角色指派給該帳戶。

您可以使用 Cloud Shell 中的 gsutil 工具授予這個角色:

開始 Cloud Shell

gsutil iam ch serviceAccount:[service-PROJECT_NUMBER]@gcp-sa-firestore.iam.gserviceaccount.com :roles/storage.admin\
gs://[BUCKET_NAME]@

您也可以在 Google Cloud 控制台授予這個角色。

停用寫入作業 (選用)

如果您在執行匯出作業時,應用程式持續寫入資料庫,匯出檔案可能不會擷取所有寫入作業。如要從一致的狀態匯出資料,請更新安全規則並停止所有 Admin SDK 作業,藉此停用資料庫的寫入作業。

  1. 更新安全性規則

    在 Firebase 控制台中,依序前往「資料庫和儲存空間」>「Firestore」>「規則」分頁標籤。

    更新來源專案安全性規則,拒絕所有寫入作業。例如:

      // Deny write access to all users under any conditions
      service cloud.firestore {
        match /databases/{database}/documents {
          match /{document=**} {
            allow write: if false;
          }
          // Reads do not affect export operations
          // Add your read rules here
        }
      }
    
  2. 停止透過 Admin SDK 寫入資料

    安全性規則不會停止來自特權伺服器環境的寫入作業,這些環境是使用 Firebase Admin SDK 或 Google Cloud Server Client Library 建立。請務必停止管理伺服器的寫入作業,方法是關閉或更新伺服器。

開始匯出作業

使用 gcloud firestore export 指令從來源專案匯出資料。你可以匯出所有資料,或只匯出特定收藏群組。將 [SOURCE_BUCKET] 替換為Cloud Storage bucket 名稱:

匯出所有資料
gcloud firestore export gs://[SOURCE_BUCKET] --async
匯出特定集合群組
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_GROUP_ID_1],[COLLECTION_GROUP_ID_2] --async

請記下匯出作業的 outputURIPrefix,稍後會用到。根據預設,Cloud Firestore 會根據時間戳記,在匯出檔案中加入前置字串:

outputUriPrefix: gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418

匯出作業執行時,您可以使用 firestore operations list 指令查看作業進度:

gcloud firestore operations list

將資料匯入目的地專案

接著,授予目的地專案存取 Cloud Firestore 資料檔案的權限,然後開始匯入作業。

授予目的地專案資料檔案的存取權

開始匯入作業前,請務必確認目的地專案可以存取Cloud Firestore資料檔案。

將資料檔案移至本機 bucket

如果來源 bucket 位置與目的地專案的Cloud Firestore位置不同,您必須將資料檔案移至與目的地專案位於相同位置的 Cloud Storage bucket。

按照「移動及重新命名 bucket」一文中的步驟,將資料檔案移至其他 Cloud Storage bucket。在下列所有步驟中,請使用這個新 bucket 做為 [SOURCE_BUCKET]。

授予專案服務帳戶來源 bucket 的存取權

如果來源 bucket 不在目標專案中,則必須授予目標專案的預設服務帳戶來源 bucket 的存取權。預設服務帳戶名為 [DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com。如要授予預設服務帳戶來源 bucket 的存取權,請授予該帳戶存取 bucket 的適當權限。

您可以使用 Cloud Shell 中的 gsutil 工具授予必要角色:

開始 Cloud Shell

gsutil iam ch serviceAccount:[DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com:legacyBucketReader,legacyObjectReader \
gs://[SOURCE_BUCKET]

您也可以在 Google Cloud 控制台授予這個角色。

開始匯入作業

開始匯入作業前,請確認 gcloud 已設定為正確的專案:

gcloud config set project [DESTINATION_PROJECT_ID]

使用 gcloud firestore import 指令,將來源 bucket 中的資料匯入目的地專案:

gcloud firestore import gs://[SOURCE_BUCKET]/[EXPORT_PREFIX] --async

其中 [EXPORT_PREFIX] 與匯出作業的 outputUriPrefix 前置字元相符。例如:

gcloud firestore import gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418 --async

匯出作業執行時,您可以使用 firestore operations list 指令查看作業進度:

gcloud firestore operations list