在專案之間移動資料

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

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

事前準備

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

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

    OwnerCloud Datastore OwnerCloud Datastore Import Export Admin

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

  3. 設定 gcloud 指令列工具,然後透過下列其中一種方式連線至專案:

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

從來源專案匯出資料

Cloud Firestore 匯出檔案建立 Cloud Storage 儲存桶,並開始匯出作業,即可匯出資料。

建立 Cloud Storage 值區

在與 Cloud Firestore 資料庫相同的位置建立 Cloud Storage 值區。如要查看資料庫位置,請參閱專案位置設定。匯出與匯入作業不適用於要求者付費值區。

如果 Cloud Storage 值區不在來源專案中,您必須授予來源專案的預設服務帳戶對該值區的存取權。每個 Google Cloud 專案都會自動建立一個名為 PROJECT_ID@appspot.gserviceaccount.com 的預設服務帳戶。Cloud Firestore匯出作業會使用這個預設服務帳戶來授權 Cloud Storage 儲存格作業。如要讓預設服務帳戶存取來源值區,請授予該帳戶 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 FirestoreRules」分頁中,更新來源專案安全性規則,拒絕所有寫入作業。例如:

      // 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 伺服器用戶端程式庫 建立的特殊權限伺服器環境中的寫入作業。請務必關閉或更新伺服器,停止管理伺服器的寫入作業。

開始匯出作業

使用 gcloud firestore export 指令,從來源專案匯出資料。您可以匯出所有資料,也可以只匯出特定集合。請將 [SOURCE_BUCKET] 替換為您的 Cloud Storage 值區名稱:

匯出所有資料
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 資料檔案。

將資料檔案移至本機值區

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

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

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

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

您可以使用 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 指令,將來源值區中的資料匯入目標專案:

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