在專案之間移動資料

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

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

事前準備

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

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

    OwnerCloud Datastore OwnerCloud 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 作業。如要授予預設服務帳戶來源 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. 更新安全性規則

    在主控台的「規則」Cloud 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 SDKGoogle 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_ID_1],[COLLECTION_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

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

按照「移動及重新命名值區」一文中的步驟,將資料檔案移至其他 Cloud Storage 值區。在後續所有步驟中,請使用這個新 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