本頁說明如何使用代管匯入和匯出功能,將 Cloud Firestore 資料從一個專案移至另一個專案。這項功能可用於設定開發環境,或將應用程式永久遷移至其他專案。本頁的範例示範如何從來源專案匯出資料,然後將該資料匯入目標專案。在專案之間移動資料的步驟如下:
- 建立 Cloud Storage 值區,用於存放來源專案的資料。
- 將資料從來源專案匯出至值區。
- 授予目的地專案從值區讀取的權限。
- 將值區中的資料匯入目的專案。
事前準備
您必須先完成下列步驟,才能使用匯出與匯入代管服務:
- 為來源專案和目的地專案啟用計費功能。只有啟用計費功能的 Google Cloud 專案才能使用匯出和匯入功能。
-
請確認您的帳戶在來源專案和目的地專案中具備必要的 Cloud IAM 權限。如果您是這兩個專案的專案擁有者,您的帳戶就具備必要權限。否則,下列 Cloud IAM 角色可授予 Cloud Firestore 匯出和匯入作業的必要權限:
Owner
、Cloud Datastore Owner
或Cloud Datastore Import Export Admin
專案擁有者可以按照「授予存取權」一節的步驟,授予其中一個角色權限。
-
設定
gcloud
指令列工具,然後透過下列其中一種方式連線至專案:-
使用 Cloud Shell 從 Google Cloud 主控台存取
gcloud
。確保將
gcloud
設定為正確的專案:gcloud config set project [SOURCE_PROJECT_ID]
-
-
在新專案中設定索引。來源專案和目的地專案中的複合索引應相符。請先設定索引,以免需要多次處理每個文件。
從來源專案匯出資料
為 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
工具授予這個角色:
gsutil iam ch serviceAccount:[service-PROJECT_NUMBER]@gcp-sa-firestore.iam.gserviceaccount.com :roles/storage.admin\ gs://[BUCKET_NAME]@
停用寫入作業 (選用)
如果應用程式在執行匯出作業時持續寫入資料庫,您可能無法在匯出檔案中擷取所有這些寫入作業。如要從一致狀態匯出資料,請更新安全性規則並停止任何 Admin SDK 作業,以便停用對資料庫的寫入作業。
更新安全性規則
在控制台的 Cloud Firestore「Rules」分頁中,更新來源專案安全性規則,拒絕所有寫入作業。例如:
// 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 } }
停止 Admin SDK 的寫入作業
安全性規則不會阻止使用 Firebase Admin SDK 或 Google 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
工具授予必要角色:
gsutil iam ch serviceAccount:[DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com:legacyBucketReader,legacyObjectReader \ gs://[SOURCE_BUCKET]
開始匯入作業
開始匯入作業前,請確認 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