匯出與匯入實體

本頁將說明如何透過匯出與匯入代管服務來匯出及匯入 Firestore (Datastore 模式) 實體。透過 Google Cloud 控制台、Google Cloud CLI 和 Datastore Admin API (RESTRPC),可使用匯出與匯入代管服務。

有了匯出與匯入代管服務,您可以還原誤刪的資料,也能夠匯出資料用以進行離線處理。您可以選擇匯出所有實體,或是只匯出特定種類的實體。同樣的,您也可以匯入某個匯出項目中的所有資料,或是只匯入特定的類別。當您使用匯出與匯入代管服務時,應考量下列要點:

  • 匯出服務使用最終一致性讀取。您不能假設匯出在一個單一時間點發生。該匯出項目能夠包含匯出開始後寫入的實體並且不會包含匯出開始前寫入的實體。

  • 匯出項目不包含任何索引。當您匯入資料時,系統會使用您資料庫現行的索引定義自動重建所需索引。個別實體屬性值索引設定會被匯出並在匯入作業期間發揮其作用。

  • 匯入項目不會為實體分配新的 ID。匯入項目會使用匯出時存在的 ID,並覆寫任何 ID 相同的現有實體。在匯入期間,系統會在匯入實體時保留這些 ID。如果在匯入作業執行時啟用了寫入,則此功能可防止與新實體的 ID 衝突。

  • 若您資料庫中的實體沒有受到匯入影響,則匯入後將會保留在資料庫中。

  • 從 Datastore 模式資料庫匯出的資料可以匯入到另一個 Datastore 模式資料庫中,即使其中一個資料庫在其他專案中亦是如此。

  • 代管匯出匯入服務目前限制並行作業數量上限為 50 項,並且允許一個專案每分鐘最多 20 個匯出和匯入要求。服務會限制每個要求的實體篩選器組合數量,最多為 100 個。

  • 代管匯出項目輸出內容採用 LevelDB 記錄檔格式

  • 如果只要匯入部分實體或將資料匯入 BigQuery,則必須在匯出時指定實體篩選器

  • .overall_export_metadata 檔案名稱必須與父項資料夾的名稱相符:

    gs://BUCKET_NAME/OPTIONAL_NAMESPACE_PATH/PARENT_FOLDER_NAME/PARENT_FOLDER_NAME.overall_export_metadata

    如果移動或複製匯出檔案,請保留 PARENT_FOLDER_NAME、子資料夾內容和 .overall_export_metadata 檔案名稱。

事前準備

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

  1. 啟用專案的計費功能 Google Cloud 。 只有啟用計費功能的專案才能使用匯出與匯入功能。 Google Cloud

  2. 在與 Firestore (Datastore 模式) 資料庫相同的位置,建立 Cloud Storage 值區。匯出與匯入作業不適用於要求者付費值區。

  3. 指派 IAM 角色給您的使用者帳戶,如要匯出資料,則授予 datastore.databases.export 權限;或要匯入資料,則授予 datastore.databases.import 權限。舉例來說,可將這兩種權限授予 Datastore Import Export Admin 角色

  4. 如果 Cloud Storage 值區在另一個專案中,請授予 Firestore 服務代理程式該值區的存取權

為專案設定 gcloud

如果您打算使用 gcloud 啟動匯入和匯出作業,請設定 gcloud 並透過下列任一方式連線至專案:

權限

如要執行匯出和匯入作業,您的使用者帳戶和專案的 Datastore 模式服務代理程式必須具備下列 Identity and Access Management 權限。

使用者帳戶權限

啟動作業的使用者帳戶或服務帳戶必須具備 datastore.databases.exportdatastore.databases.import 的 IAM 權限。如果您是專案擁有者,您的帳戶必須擁有必要權限。若非如此,下列 IAM 角色可授予必要權限:

  • 資料儲存庫擁有者
  • Datastore 匯入匯出管理員

您也可以透過自訂角色指派這些權限。

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

服務代理權限

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

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

如要進一步瞭解服務代理人,請參閱「服務代理人」。

Firestore 服務代理需要存取匯出或匯入作業所用的 Cloud Storage 值區。根據預設,如果您的 Cloud Storage 值區與 Firestore 資料庫皆屬同一個專案,Firestore 服務代理即可存取該值區

如果 Cloud Storage 值區在另一個專案中,則必須授予 Firestore 服務代理對 Cloud Storage 值區的存取權。

指派角色給服務代理

您可以使用 gsutil 指令列工具指派下列其中一種角色。舉例來說,如要將「Storage 管理員」角色指派給 Firestore 服務代理,請執行下列指令:

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

PROJECT_NUMBER 替換為您的專案編號,這會用於命名 Firestore 服務代理程式。如要查看服務代理名稱,請參閱「查看服務代理名稱」。

或者,您也可以使用 Google Cloud 控制台指派此角色

查看服務代理名稱

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

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

  3. 按一下導覽選單中的「匯入/匯出」

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

匯出作業

對於涉及其他專案值區的匯出作業,請修改該值區的權限,將下列其中一個身分與存取權管理角色指派給含有 Datastore 模式資料庫的專案 Datastore 模式服務代理程式:

  • 儲存空間管理員
  • 擁有者 (基本角色)

您也可以建立 IAM 自訂角色,並指派與上述角色所含權限略有不同的權限:

  • storage.buckets.get
  • storage.objects.create
  • storage.objects.delete
  • storage.objects.list

匯入作業

對於涉及其他 Cloud Storage 值區的匯入作業,請修改該值區的權限,將下列其中一個 Cloud Storage 角色指派給含有 Datastore 模式資料庫的專案 Datastore 模式服務代理程式:

  • 儲存空間管理員
  • Storage 物件檢視者和 Storage 舊版值區讀取者

您也可以建立具有以下權限的 IAM 自訂角色

  • storage.buckets.get
  • storage.objects.get

啟用匯出與匯入代管作業

本節說明如何啟用匯出與匯入代管作業。

匯出所有實體

控制台

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

  1. 按一下導覽選單中的「匯入/匯出」
  2. 按一下 [匯出]
  3. 將「命名空間」欄位設為 All Namespaces,並將「種類」欄位設為 All Kinds
  4. 在「目的地」下方,輸入 Cloud Storage bucket 的名稱。
  5. 按一下 [匯出]

控制台會返回「匯入/匯出」頁面。系統會發出快訊,回報受管理匯出要求是否成功。

gcloud

使用 gcloud firestore export 指令匯出資料庫中的所有實體。

 gcloud firestore export gs://bucket-name --async --database=DATABASE

其中 bucket-name 是 Cloud Storage bucket 的名稱和選用的前置字串,例如 bucket-name/datastore-exports/export-name。您無法在其他匯出作業中重複使用相同前置字元。如果您未提供檔案前置字串,代管匯出服務會根據目前時間建立前置字串。

使用 [--async][async-flag] 標記,避免 gcloud 等待作業完成。如果省略 --async 旗標,可以輸入 Ctrl+c 停止等待作業。這不會取消作業。

--database 旗標設為要匯出實體的資料庫名稱。如要使用預設資料庫,請使用 --database='(default)'

rest

使用任何要求資料之前,請先替換以下項目:

  • project-id:您的專案 ID
  • bucket-name:您的 Cloud Storage bucket 名稱

HTTP 方法和網址:

POST https://datastore.googleapis.com/v1/projects/project-id:export

JSON 要求主體:

{
  "outputUrlPrefix": "gs://bucket-name",
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/project-id/operations/operation-id",
  "metadata": {
    "@type": "type.googleapis.com/google.datastore.admin.v1.ExportEntitiesMetadata",
    "common": {
      "startTime": "2019-09-18T18:42:26.591949Z",
      "operationType": "EXPORT_ENTITIES",
      "state": "PROCESSING"
    },
    "entityFilter": {},
    "outputUrlPrefix": "gs://bucket-name/2019-09-18T18:42:26_85726"
  }
}
回應是個長時間執行的作業,讓您檢查匯出作業是否完成。

匯出特定種類或命名空間

如要匯出部分特定種類及/或命名空間,請為「實體篩選器」提供種類和命名空間 ID 的值。每個要求最多只能有 100 個實體篩選器組合,其中每個篩選種類和命名空間的組合,都會計為一個篩選器。

控制台

在控制台中,您可以選取所有種類或特定種類。 同樣地,您可以選取所有命名空間或特定命名空間。

如要指定要匯出的命名空間和類別清單,請改用 gcloud

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

  3. 按一下導覽選單中的「匯入/匯出」

  4. 按一下 [匯出]

  5. 將「命名空間」欄位設為 All Namespaces 或其中一個命名空間的名稱。

  6. 將「Kind」欄位設為 All Kinds 或種類名稱。

  7. 在「目的地」下方,輸入 Cloud Storage 值區名稱。

  8. 按一下 [匯出]

控制台會返回「匯入/匯出」頁面。系統會發出快訊,回報受管理匯出要求是否成功。

gcloud

  gcloud firestore export --collection-ids="KIND1,KIND2" \
  --namespaces="(default),NAMESPACE2" \
  gs://bucket-name \
  --async \
  --database=DATABASE

其中 bucket-name 是 Cloud Storage bucket 的名稱和選用的前置字串,例如 bucket-name/datastore-exports/export-name。您無法在其他匯出作業中重複使用相同前置字元。如果您未提供檔案前置字串,代管匯出服務會根據目前時間建立前置字串。

使用 [--async][async-flag] 標記,避免 gcloud 等待作業完成。如果省略 --async 旗標,可以輸入 Ctrl+c 停止等待作業。這不會取消作業。

--database 旗標設為要匯出特定種類或命名空間的資料庫名稱。如要使用預設資料庫,請使用 --database='(default)'

rest

使用任何要求資料之前,請先替換以下項目:

  • project-id:您的專案 ID
  • bucket-name:您的 Cloud Storage bucket 名稱
  • kind:實體種類
  • namespace:命名空間 ID (預設的命名空間 ID 則使用 "")

HTTP 方法和網址:

POST https://datastore.googleapis.com/v1/projects/project-id:export

JSON 要求主體:

{
  "outputUrlPrefix": "gs://bucket-name",
  "entityFilter": {
    "kinds": ["kind"],
    "namespaceIds": ["namespace"],
  },
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/project-id/operations/operation-id",
  "metadata": {
    "@type": "type.googleapis.com/google.datastore.admin.v1.ExportEntitiesMetadata",
    "common": {
      "startTime": "2019-09-18T21:17:36.232704Z",
      "operationType": "EXPORT_ENTITIES",
      "state": "PROCESSING"
    },
    "entityFilter": {
      "kinds": [
        "Task"
      ],
      "namespaceIds": [
        ""
      ]
    },
    "outputUrlPrefix": "gs://bucket-name/2019-09-18T21:17:36_82974"
  }
}
回應是個長時間執行的作業,讓您檢查匯出作業是否完成。

中繼資料檔案

在匯出作業中,會建立每個指定命名空間與種類組合的中繼資料檔案。中繼資料檔案名稱通常是 NAMESPACE_NAME_KIND_NAME.export_metadata。但是,如果命名空間或種類建立的 Cloud Storage 物件名稱無效,檔案名稱就會是 export[NUM].export_metadata

中繼資料檔案為通訊協定緩衝區,可透過 protoc 通訊協定編譯器進行解碼。舉例來說,您可以將中繼資料檔案解碼,判斷匯出檔案中包含的命名空間和種類:

protoc --decode_raw < export0.export_metadata

匯入所有實體

控制台

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

  3. 按一下導覽選單中的「匯入/匯出」

  4. 按一下「匯入」

  5. File 欄位中,按一下「瀏覽」並選取 .overall_export_metadata 檔案。

    確認 .overall_export_metadata 檔案未從預設位置移動。

  6. 將「命名空間」欄位設為 All Namespaces,並將「種類」欄位設為 All Kinds

  7. 按一下「匯入」

控制台會返回「匯入/匯出」頁面。系統會發出快訊,回報受管理匯入要求是否成功。

gcloud

使用 gcloud firestore import 指令,匯入先前透過匯出代管服務匯出的所有實體。

gcloud firestore import gs://bucket-name/file-path/file-name.overall_export_metadata \
--async \
--database=DATABASE

其中 bucket-name/file-path/file-name 是 Cloud Storage 值區中 overall_export_metadata 檔案的路徑。

使用 [--async][async-flag] 標記,避免 gcloud 等待作業完成。如果省略 --async 旗標,可以輸入 Ctrl+c 停止等待作業。這不會取消作業。

--database 旗標設為要匯入所有實體的資料庫名稱。如要使用預設資料庫,請使用 --database='(default)'

rest

使用任何要求資料之前,請先替換以下項目:

  • project-id:您的專案 ID
  • bucket-name:您的 Cloud Storage bucket 名稱
  • object-name:您的 Cloud Storage 物件名稱 (例如:2017-05-25T23:54:39_76544/2017-05-25T23:54:39_76544.overall_export_metadata)

HTTP 方法和網址:

POST https://datastore.googleapis.com/v1/projects/project-id:import

JSON 要求主體:

{
  "inputUrl": "gs://bucket-name/object-name",
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/project-id/operations/operation-id",
  "metadata": {
    "@type": "type.googleapis.com/google.datastore.admin.v1.ImportEntitiesMetadata",
    "common": {
      "startTime": "2019-09-18T21:25:02.863621Z",
      "operationType": "IMPORT_ENTITIES",
      "state": "PROCESSING"
    },
    "entityFilter": {},
    "inputUrl": "gs://bucket-name/2019-09-18T18:42:26_85726/2019-09-18T18:42:26_85726.overall_export_metadata"
  }
}
回應是個長時間執行的作業,讓您檢查匯出作業是否完成。

找出 overall_export_metadata 檔案

您可以使用 Google Cloud 控制台中的 Cloud Storage 瀏覽器,判斷要用於匯入位置的值:

開啟 Cloud Storage 瀏覽器

您也可以列出並說明已完成的作業outputURL 欄位會顯示 overall_export_metadata 檔案的名稱:

"outputUrl": "gs://bucket-name/2017-05-25T23:54:39_76544/2017-05-25T23:54:39_76544.overall_export_metadata",

匯入特定種類或命名空間

若要匯入部分特定種類和/或命名空間,請為實體篩選器提供種類和命名空間 ID 的值。

只有在匯出檔案是使用實體篩選器建立的情況下,您才能指定種類和命名空間。您無法從所有實體的匯出項目中,匯入一部分種類和命名空間。

控制台

在控制台中,您可以選取所有種類或特定種類。 同樣地,您可以選取所有命名空間或特定命名空間。

如要指定要匯入的命名空間和類別清單,請改用 gcloud

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

  3. 按一下導覽選單中的「匯入/匯出」

  4. 按一下「匯入」

  5. File 欄位中,按一下「瀏覽」並選取 .overall_export_metadata 檔案。

    請務必匯入 .overall_export_metadata 檔案,而非 .export_metadata 檔案。

  6. 將「命名空間」欄位設為 All Namespaces 或特定命名空間。

  7. 將「Kind」欄位設為 All Kinds 或特定種類。

  8. 按一下「匯入」

控制台會返回「匯入/匯出」頁面。系統會發出快訊,回報受管理匯入要求是否成功。

gcloud

  gcloud firestore import --collection-ids="KIND1,KIND2" \
  --namespaces="(default),NAMESPACE2" \
  gs://bucket-name/file-path/file-nameoverall_export_metadata \
  --async \
  --database=DATABASE

其中 bucket-name/file-path/file-name 是 Cloud Storage 值區中 overall_export_metadata 檔案的路徑。

使用 [--async][async-flag] 標記,避免 gcloud 等待作業完成。如果省略 --async 旗標,可以輸入 Ctrl+c 停止等待作業。這不會取消作業。

--database 旗標設為要匯入特定種類或命名空間的資料庫名稱。如要使用預設資料庫,請使用 --database='(default)'

rest

使用任何要求資料之前,請先替換以下項目:

  • project-id:您的專案 ID
  • bucket-name:您的 Cloud Storage bucket 名稱
  • object-name:您的 Cloud Storage 物件名稱 (例如:2017-05-25T23:54:39_76544/2017-05-25T23:54:39_76544.overall_export_metadata)
  • kind:實體種類
  • namespace:命名空間 ID (預設的命名空間 ID 則使用 "")

HTTP 方法和網址:

POST https://datastore.googleapis.com/v1/projects/project-id:import

JSON 要求主體:

{
  "inputUrl": "gs://bucket-name/object-name",
  "entityFilter": {
    "kinds": ["kind"],
    "namespaceIds": ["namespace"],
  },
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/project-id/operations/operation-id",
  "metadata": {
    "@type": "type.googleapis.com/google.datastore.admin.v1.ImportEntitiesMetadata",
    "common": {
      "startTime": "2019-09-18T21:51:02.830608Z",
      "operationType": "IMPORT_ENTITIES",
      "state": "PROCESSING"
    },
    "entityFilter": {
      "kinds": [
        "Task"
      ],
      "namespaceIds": [
        ""
      ]
    },
    "inputUrl": "gs://bucket-name/2019-09-18T21:49:25_96833/2019-09-18T21:49:25_96833.overall_export_metadata"
  }
}
回應是個長時間執行的作業,讓您檢查匯出作業是否完成。

從 PITR 資料匯出及匯入

您可以從 [PITR 資料][pitr]將資料庫匯出至 Cloud Storage。 您可以匯出時間戳記為過去七天內整分鐘的時間點復原資料,但不得早於 earliestVersionTime。如果指定時間戳記的資料已不存在,匯出作業就會失敗。

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

匯出 PITR 資料前,請注意下列事項:

  • 請以 RFC 3339 格式指定時間戳記。例如:2023-05-26T10:20:00.00Z
  • 請確認指定的時間戳記是過去七天內的整分時間戳記,但不得早於 earliestVersionTime。如果指定時間戳記的資料已不存在,系統會產生錯誤。
  • 如果 PITR 匯出作業失敗,您不需付費。

控制台

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」
  2. 從資料庫清單中選取資料庫。
  3. 按一下導覽選單中的「匯入/匯出」
  4. 按一下 [匯出]
  5. 選擇要匯出的命名空間
  6. 選取要匯出的種類。
  7. 在「選擇要匯出的資料庫狀態」部分,選取「從較早的時間點匯出」

    選取要用於匯出的快照時間

  8. 在「目的地」專區中,輸入 Cloud Storage 值區名稱,或使用「瀏覽」按鈕選取值區。
  9. 按一下 [匯出]

    控制台會返回「匯入/匯出」頁面。如果作業順利開始,頁面會將項目新增至「近期匯入和匯出」頁面。如果失敗,頁面會顯示錯誤訊息。

gcloud

您可以使用 gcloud firestore export 指令,從 PITR 資料將資料庫匯出至 Cloud Storage。PITR 匯出作業支援所有篩選器,包括匯出所有實體,以及匯出特定種類或命名空間。

匯出資料庫,並將 snapshot-time 參數指定為復原時間戳記。執行下列指令,將資料庫匯出至 bucket。

gcloud firestore export gs://[BUCKET_NAME_PATH] \
          --snapshot-time=[PITR_TIMESTAMP] \
          --collection-ids=[COLLECTION_IDS] \
          --namespace-ids=[NAMESPACE_IDS]

其中 PITR_TIMESTAMP 是精細程度為分鐘的 PITR 時間戳記,例如 2023-05-26T10:20:00.00Z

匯入轉換

從其他專案匯入實體時,請注意實體鍵包含專案 ID。匯入作業會使用目標專案的專案 ID,更新匯入資料中的實體鍵和鍵參照屬性。如果這項更新會增加實體大小,可能會導致匯入作業發生「實體過大」或「索引項目過大」錯誤。

如要避免發生這兩種錯誤,請匯入專案 ID 較短的目標專案。這不會影響從相同專案匯入資料的作業。

管理長時間執行的作業

代管匯入及匯出作業屬於長時間執行的作業。 這些方法呼叫可能需要大量時間才能完成。

開始匯出或匯入作業後,Datastore 模式會為作業指派專屬名稱。您可以使用作業名稱刪除、取消或檢查作業狀態。

作業名稱的前置字串為 projects/[PROJECT_ID]/databases/(default)/operations/,例如:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

gcloud 指令指定作業名稱時,可以省略前置字串。

列出所有長時間執行的作業

您可以透過下列方式查看進行中和最近完成的作業。匯出完成後其項目會保留幾天:

控制台

您可以在 Google Cloud 控制台的「Import/Export」(匯入/匯出) 頁面中,查看長時間運行的作業清單。

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

  3. 按一下導覽選單中的「匯入/匯出」

gcloud

如要列出長時間執行的作業,請使用 gcloud datastore operations list 指令。

gcloud datastore operations list

舉例來說,最近完成的匯出作業會顯示下列資訊:

{
  "operations": [
    {
      "name": "projects/project-id/operations/ASAyMDAwOTEzBxp0bHVhZmVkBxJsYXJ0bmVjc3Utc2Jvai1uaW1kYRQKKhI",
      "metadata": {
        "@type": "type.googleapis.com/google.datastore.admin.v1.ExportEntitiesMetadata",
        "common": {
          "startTime": "2017-12-05T23:01:39.583780Z",
          "endTime": "2017-12-05T23:54:58.474750Z",
          "operationType": "EXPORT_ENTITIES"
        },
        "progressEntities": {
          "workCompleted": "21933027",
          "workEstimated": "21898182"
        },
        "progressBytes": {
          "workCompleted": "12421451292",
          "workEstimated": "9759724245"
        },
        "entityFilter": {
          "namespaceIds": [
            ""
          ]
        },
        "outputUrlPrefix": "gs://bucket-name"
      },
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.datastore.admin.v1.ExportEntitiesResponse",
        "outputUrl": "gs://bucket-name/2017-05-25T23:54:39_76544/2017-05-25T23:54:39_76544.overall_export_metadata"
      }
    }
  ]
}

rest

使用任何要求資料之前,請先替換以下項目:

  • project-id:您的專案 ID

HTTP 方法和網址:

GET https://datastore.googleapis.com/v1/projects/project-id/operations

如要傳送要求,請展開以下其中一個選項:

請查看以下回應的相關資訊。

舉例來說,最近完成的匯出作業會顯示下列資訊:

{
  "operations": [
    {
      "name": "projects/project-id/operations/ASAyMDAwOTEzBxp0bHVhZmVkBxJsYXJ0bmVjc3Utc2Jvai1uaW1kYRQKKhI",
      "metadata": {
        "@type": "type.googleapis.com/google.datastore.admin.v1.ExportEntitiesMetadata",
        "common": {
          "startTime": "2017-12-05T23:01:39.583780Z",
          "endTime": "2017-12-05T23:54:58.474750Z",
          "operationType": "EXPORT_ENTITIES"
        },
        "progressEntities": {
          "workCompleted": "21933027",
          "workEstimated": "21898182"
        },
        "progressBytes": {
          "workCompleted": "12421451292",
          "workEstimated": "9759724245"
        },
        "entityFilter": {
          "namespaceIds": [
            ""
          ]
        },
        "outputUrlPrefix": "gs://bucket-name"
      },
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.datastore.admin.v1.ExportEntitiesResponse",
        "outputUrl": "gs://bucket-name/2017-05-25T23:54:39_76544/2017-05-25T23:54:39_76544.overall_export_metadata"
      }
    }
  ]
}

檢查作業狀態

如要查看長時間執行作業的狀態:

控制台

您可以在 Google Cloud 控制台的「匯入/匯出」頁面中,查看最近的匯出和匯入作業清單。

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

  3. 按一下導覽選單中的「匯入/匯出」

gcloud

使用 operations describe 指令顯示長時間執行的作業狀態。

gcloud datastore operations describe operation-name

rest

使用任何要求資料之前,請先替換以下項目:

  • project-id:您的專案 ID
  • operation-name:作業名稱

HTTP 方法和網址:

GET https://datastore.googleapis.com/v1/projects/project-id/operations/operation-name

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/project-id/operations/ASA3ODAwMzQxNjIyChp0bHVhZmVkBxJsYXJ0bmVjc3Utc2Jvai1uaW1kYRQKLRI",
  "metadata": {
    "@type": "type.googleapis.com/google.datastore.admin.v1.ExportEntitiesMetadata",
    "common": {
      "startTime": "2019-10-08T20:07:28.105236Z",
      "endTime": "2019-10-08T20:07:36.310653Z",
      "operationType": "EXPORT_ENTITIES",
      "state": "SUCCESSFUL"
    },
    "progressEntities": {
      "workCompleted": "21",
      "workEstimated": "21"
    },
    "progressBytes": {
      "workCompleted": "2272",
      "workEstimated": "2065"
    },
    "entityFilter": {},
    "outputUrlPrefix": "gs://bucket-name/2019-10-08T20:07:28_28481"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.datastore.admin.v1.ExportEntitiesResponse",
    "outputUrl": "gs://bucket-name/2019-10-08T20:07:28_28481/2019-10-08T20:07:28_28481.overall_export_metadata"
  }
}

估算完成時間

作業執行時,可查看 state 欄位值,以瞭解作業的整體狀態。

用於取得長時間執行作業狀態的要求,會傳回 workEstimatedworkCompleted 指標。每個指標都會以位元組數及實體數回傳:

  • workEstimated 會顯示作業將要處理的位元組總數和文件總數預估值。如果無法估算,Datastore 模式可能會省略這項指標。

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

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

例如,以下是匯出作業的進度狀態:

{
  "operations": [
    {
      "name": "projects/project-id/operations/ASAyMDAwOTEzBxp0bHVhZmVkBxJsYXJ0bmVjc3Utc2Jvai1uaW1kYRQKKhI",
      "metadata": {
        "@type": "type.googleapis.com/google.datastore.admin.v1.ExportEntitiesMetadata",
        ...
        "progressEntities": {
          "workCompleted": "1",
          "workEstimated": "3"
        },
        "progressBytes": {
          "workCompleted": "85",
          "workEstimated": "257"
        },
        ...

作業完成時,作業說明中會包含 "done": true。查看 state 欄位值可得知作業結果。如果未在回應中設定 done 欄位,則其值為 false。若是進行中的作業,則不用考慮是否有 done 值。

取消作業

控制台

您可以在 Google Cloud 控制台的「匯入/匯出」頁面中,取消正在執行的匯出或匯入作業。

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

  3. 按一下導覽選單中的「匯入/匯出」

在「最近的匯入和匯出作業」表格中,目前執行的作業會在「已完成」欄中顯示「取消」按鈕。按一下「取消」按鈕即可停止作業。作業完全停止後,按鈕會先顯示「正在取消」訊息,然後顯示「已取消」

gcloud

使用 operations cancel 指令停止進行中的作業:

gcloud datastore operations cancel operation-name

取消正在執行的作業不會復原作業。取消匯出作業後,已匯出的文件仍會保留在 Cloud Storage 中;取消匯入作業後,資料庫中已更新的內容仍會保留。您無法匯入部分完成的匯出作業。

刪除作業

gcloud

使用 operations delete 指令,從近期作業清單中移除作業。這項指令不會從 Cloud Storage 刪除匯出檔案。

gcloud datastore operations delete operation-name

代管匯出匯入服務的計費及定價

使用匯出與匯入代管服務前,您需要先為 Google Cloud 專案啟用計費功能。匯出與匯入作業會以下列方式計入您的 Google Cloud 費用:

待匯出或匯入作業完成後,系統才會發出關於Google Cloud 預算的提醒。同樣地,在匯出或匯入作業期間執行的讀寫,將在作業完成後計入您的每日配額

查看匯出和匯入費用

匯出和匯入作業會將 goog-firestoremanaged:exportimport 標籤套用至計費作業。在 Cloud 帳單報表頁面中,您可以使用這個標籤查看與匯入及匯出作業相關的費用:

從篩選器選單存取 goog-firestoremanaged 標籤。

與 Datastore 管理員備份的差異

如果您先前使用 Datastore Admin 控制台進行備份,請注意下列幾項差異:

  • 代管匯出的項目不會顯示在 Datastore Admin 控制台中。代管匯出匯入是一項新的服務,不與 App Engine 的備份和還原功能共享資料 (此功能由 Google Cloud 控制台管理)。

  • 代管匯出與匯入服務不支援與 Datastore Admin 備份相同的中繼資料,也不會在您的資料庫儲存進度狀態。如需瞭解檢查匯出與匯入作業進度,請參閱管理長時間運行的作業

  • 您無法查看代管匯出與匯入作業的服務記錄。

  • 代管匯入服務向後兼容 Datastore Admin 備份文件。您可以使用代管匯入服務,匯入 Datastore Admin 備份檔案,但無法透過 Datastore Admin 控制台匯入經由代管匯出作業匯出之項目。

匯入至 BigQuery

如要將匯出代管的資料匯入 BigQuery,請參閱載入 Datastore 匯出服務資料

假如不指定實體篩選器,匯出的資料就無法載入 BigQuery。如果希望將匯出的資料匯入 BigQuery,則匯出時要求的實體篩選器中必須包含一或多個種類名稱。

BigQuery 資料欄限制

BigQuery 對每個資料表設有 10,000 個資料欄的限制。匯出作業會為每個種類產生 BigQuery 資料表結構定義。在這個架構中,每個種類實體中的不重複屬性都會成為架構資料欄。

如果某個類別的 BigQuery 結構定義超過 10,000 個資料欄,匯出作業會將內嵌實體視為 Blob,盡量不超過資料欄限制。如果轉換後結構定義中的資料欄數少於 10,000 個,您可以將資料載入 BigQuery,但無法查詢內嵌實體中的屬性。如果欄數仍超過 10,000,匯出作業就不會為該類別產生 BigQuery 結構定義,您也無法將資料載入 BigQuery。

服務代理人遷移

Firestore 會使用 Firestore 服務代理授權匯入和匯出作業,而不是使用 App Engine 服務帳戶。服務代理程式和服務帳戶使用下列命名慣例:

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

Firestore 過去使用 App Engine 預設服務帳戶,而非 Firestore 服務代理。如果資料庫仍使用 App Engine 服務帳戶匯入或匯出資料,建議按照本節的說明,改用 Firestore 服務代理。

App Engine 服務帳戶
PROJECT_ID@appspot.gserviceaccount.com

Firestore 服務代理人是較好的選擇,因為這是專為 Firestore 設計的代理人。App Engine 服務帳戶由多項服務共用。

查看授權帳戶

您可以在 Google Cloud 控制台的「匯入/匯出」頁面中,查看匯入和匯出作業授權要求時使用的帳戶。您也可以查看資料庫是否已使用 Firestore 服務代理程式。

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

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

如果專案未使用 Firestore 服務代理人,您可以透過下列任一方法遷移至 Firestore 服務代理人:

建議使用第一種方法,因為這樣可將影響範圍限制在單一 Datastore 模式專案。第二種方法不建議使用,因為不會遷移現有的 Cloud Storage 值區權限。不過,這項服務提供機構層級的安全合規性。

檢查並更新 Cloud Storage 值區權限,然後進行遷移

遷移程序分為兩個步驟:

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

服務代理 bucket 權限

如要執行匯出或匯入作業,並使用其他專案中的 Cloud Storage 值區,您必須授予 Firestore 服務代理程式該值區的權限。舉例來說,將資料移至其他專案的作業,需要存取該專案中的值區。否則,遷移至 Firestore 服務代理人後,這些作業就會失敗。

如果匯入和匯出工作流程都在同一個專案中,就不需要變更權限。根據預設,Firestore 服務代理可以存取同一個專案中的 bucket。

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

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

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

將專案遷移至 Firestore 服務代理

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

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

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

    按一下「Check Bucket Status」(檢查值區狀態)。

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

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

  5. 請記下專案 Datastore 模式服務代理程式的主體名稱。服務代理名稱會顯示在「應授予存取權的服務代理」標籤下方。
  6. 如要使用清單中的任何水桶進行日後的匯入或匯出作業,請完成下列步驟:

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

    2. 按一下「新增」
    3. 在「New principals」(新增主體) 欄位中,輸入 Firestore 服務代理程式的名稱。
    4. 在「Select a role」(請選擇角色) 欄位中,依序選取「Service Agents」(服務代理人) >「Firestore Service Agent」(Firestore 服務代理人)
    5. 按一下 [儲存]
    6. 返回 Datastore 模式的「匯入/匯出」頁面。
    7. 針對清單中的其他值區重複上述步驟。請務必查看清單的所有頁面。
  7. 按一下「遷移至 Firestore 服務代理人」。如果仍有值區的權限檢查失敗,請按一下「遷移」確認遷移。

    遷移作業完成後,系統會發出快訊通知。遷移作業無法復原。

查看遷移狀態

如要確認專案的遷移狀態,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

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

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

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

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

新增全機構適用的政策限制

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

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

    這項限制規定匯入和匯出作業必須使用 Firestore 服務代理授權要求。如要設定這項限制,請參閱「 建立及管理機構政策 」。

套用這項機構政策限制後,系統不會自動為 Firestore 服務代理授予適當的 Cloud Storage bucket 權限。

如果限制導致任何匯入或匯出工作流程發生權限錯誤,您可以停用限制,改回使用預設服務帳戶。檢查並更新 Cloud Storage bucket 權限後,即可再次啟用限制。