使用時間點復原 (PITR)

本頁說明如何使用時間點復原 (PITR) 功能,保留及復原 Firestore 中的資料。

如要瞭解 PITR 概念,請參閱「時間點復原」。

權限

如要取得管理 PITR 設定所需的權限,請要求管理員授予您專案的 Cloud Datastore 擁有者 (roles/datastore.owner) IAM 角色,並啟用該專案的 PITR 設定。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備管理 PITR 設定所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要管理 PITR 設定,您必須具備下列權限:

  • 如要在建立資料庫時啟用 PITR,請按照下列步驟操作: datastore.databases.create
  • 如要更新現有資料庫的時間點復原設定,請按照下列步驟操作: datastore.databases.update,datastore.databases.list
  • 如要從 PITR 資料執行讀取作業: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • 如要匯出 PITR 資料,請按照下列步驟操作: datastore.databases.export
  • 如要匯入 PITR 資料,請按照下列步驟操作: datastore.databases.import

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

事前準備

開始使用 PITR 前,請注意下列事項:

  • 啟用 PITR 後,您無法立即開始讀取七天前的資料。
  • 如要在建立資料庫時啟用 PITR,請務必使用 gcloud firestore databases create 指令。使用 Google Cloud 主控台建立資料庫時,不支援啟用 PITR。
  • 啟用 PITR 後,Firestore 會開始保留版本。
  • 停用 PITR 後,您就無法在 PITR 期間讀取 PITR 資料。
  • 如果停用 PITR 後立即重新啟用,系統將無法再提供過去的 PITR 資料。停用 PITR 前建立的任何 PITR 資料,都會在 PITR 到期日後刪除。
  • 如果您在過去一小時內不慎刪除資料,且 PITR 已停用,請在刪除資料後一小時內啟用 PITR,即可還原資料。
  • 對過期 PITR 資料執行的任何讀取作業都會失敗。

啟用 PITR

使用 PITR 前,請先啟用 Google Cloud 專案的計費功能。只有啟用帳單功能的 Google Cloud 專案才能使用 PITR 功能。

如要為資料庫啟用 PITR,請按照下列步驟操作:

控制台

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

    前往「資料庫」

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

  3. 在導覽選單中,按一下「Disaster Recovery」(災害復原)

  4. 按一下「編輯」即可編輯設定。

  5. 勾選「Enable point-in-time recovery」(啟用時間點還原) 核取方塊,然後按一下「Save」(儲存)

啟用 PITR 會產生儲存空間費用。詳情請參閱定價

如要停用 PITR,請在 Google Cloud 控制台的「Disaster Recovery」(災害復原) 頁面中,取消勾選「Enable point-in-time recovery」(啟用時間點復原) 核取方塊。

gcloud

使用 gcloud firestore databases create 指令建立資料庫時,請啟用 PITR,如下所示:

gcloud firestore databases create\
  --location=LOCATION\
  [--database=DATABASE_ID; default="(default)"]\
  [--type=TYPE; default="firestore-native"]\
  --enable-pitr

將值替換為下列內容:

  • LOCATION:要在哪個位置建立資料庫。
  • DATABASE_ID - 設為資料庫 ID 或 (預設)。
  • TYPE - 設為 firestore-native。

您可以使用 gcloud firestore databases update 指令停用 PITR,如下所示:

gcloud firestore databases update\
  [--database=DATABASE_ID; default="(default)"]\
  --no-enable-pitr

將值替換為下列內容:

  • DATABASE_ID - 設為資料庫 ID 或 (預設)。

取得保留期限和最早版本時間

控制台

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

    前往「資料庫」

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

  3. 在導覽選單中,按一下「Disaster Recovery」(災害復原)

  4. 在「設定」部分,請注意「保留期限」和「最早版本時間」

    • 保留期限:Firestore 保留資料庫所有資料版本的期限。如果停用 PITR,保留期限為一小時;如果啟用 PITR,保留期限為七天。
    • 最早版本時間:時間點復原 (PITR) 期間內可讀取資料舊版本的最早時間戳記。Firestore 會持續更新這個值,但查詢時會過時。如果您使用這個值復原資料,請務必將查詢值到啟動復原作業之間的時間納入考量。
    • 時間點復原:如果已啟用 PITR,會顯示 Enabled。如果 PITR 已停用,您會看到 Disabled

gcloud

執行 gcloud firestore databases describe 指令,如下所示:

gcloud firestore databases describe --database=DATABASE_ID

DATABASE_ID 替換為資料庫 ID 或 '(default)'

輸出內容如下:

    appEngineIntegrationMode: ENABLED
    concurrencyMode: PESSIMISTIC
    createTime: '2021-03-24T17:02:35.234Z'
    deleteProtectionState: DELETE_PROTECTION_DISABLED
    earliestVersionTime: '2023-06-12T16:17:25.222474Z'
    etag: IIDayqOevv8CMNTvyNK4uv8C
    keyPrefix: s
    locationId: nam5
    name: projects/PROJECT_ID/databases/DATABASE_ID
    pointInTimeRecoveryEnablement: POINT_IN_TIME_RECOVERY_DISABLED
    type: FIRESTORE_NATIVE
    uid: 5230c382-dcd2-468f-8cb3-2a1acfde2b32
    updateTime: '2021-11-17T17:48:22.171180Z'
    versionRetentionPeriod: 3600s

其中:

  • earliestVersionTime:儲存最早 PITR 資料的時間戳記。
  • pointInTimeRecoveryEnablement:如果啟用 PITR,則會顯示 POINT_IN_TIME_RECOVERY_ENABLED。如果停用 PITR,您會看到 POINT_IN_TIME_RECOVERY_DISABLED,或系統可能不會顯示 pointInTimeRecoveryEnablement 欄位。
  • versionRetentionPeriod:以毫秒為單位,表示 PITR 資料的保留時間。如果停用時間點復原功能,值可以是一小時;如果啟用時間點復原功能,值可以是七天。

讀取 PITR 資料

您可以使用用戶端程式庫、REST API 方法或 FirestoreIO Apache Beam 連接器讀取 PITR 資料。

用戶端程式庫

Java

您必須使用 ReadOnly 交易才能讀取 PITR 資料。您無法直接在讀取作業中指定 readTime。 詳情請參閱「交易和批次寫入」。

  Firestore firestore = 

  TransactionOptions options =
          TransactionOptions.createReadOnlyOptionsBuilder()
              .setReadTime(
                  com.google.protobuf.Timestamp.newBuilder()
                      .setSeconds(1684098540L)
                      .setNanos(0))
              .build();

  ApiFuture<Void> futureTransaction = firestore.runTransaction(
              transaction -> {
                // Does a snapshot read document lookup
                final DocumentSnapshot documentResult =
                    transaction.get(documentReference).get();

                // Executes a snapshot read query
                final QuerySnapshot queryResult =
                  transaction.get(query).get();
              },
              options);

  // Blocks on transaction to complete
  futureTransaction.get();

節點

您必須使用 ReadOnly 交易才能讀取 PITR 資料。您無法直接在讀取作業中指定 readTime。 詳情請參閱「交易和批次寫入」。

const documentSnapshot = await firestore.runTransaction(
    updateFunction => updateFunction.get(documentRef),
    {readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
);

const querySnapshot = await firestore.runTransaction(
    updateFunction => updateFunction.get(query),
    {readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
);

REST API

所有 Firestore 讀取方法都支援 PITR 讀取,包括 getlistbatchGetlistCollectionIdslistDocumentsrunQueryrunAggregationQuerypartitionQuery

如要使用 REST 方法執行讀取作業,請嘗試下列其中一種做法:

  1. 在讀取方法要求中,將 readTime 值做為 readOptions 方法中支援的 PITR 時間戳記傳遞。PITR 時間戳記可以是過去一小時內精確到微秒的時間戳記,也可以是過去一小時以外精確到整分鐘的時間戳記,但不得早於 earliestVersionTime

  2. 搭配 BeginTransaction 方法使用 readTime 參數,做為多個 PITR 讀取作業的ReadOnly交易一部分。

Apache Beam

使用 FirestoreIO Apache Beam 連接器,透過 Dataflow 大規模讀取或寫入 Firestore 資料庫中的文件。

FirestoreIO 連接器的下列讀取方法支援 PITR 讀取作業。這些讀取方法支援 withReadTime(@Nullable Instant readTime) 方法,可用於 PITR 讀取:

Java

下列程式碼可搭配範例 Dataflow 管道程式碼,用於大量讀取或寫入作業。本範例使用 withReadTime(@Nullable Instant readTime) 方法進行 PITR 讀取。

  Instant readTime = Instant.ofEpochSecond(1684098540L);

  PCollection<Document> documents =
      pipeline
          .apply(Create.of(collectionId))
          .apply(
              new FilterDocumentsQuery(
                  firestoreOptions.getProjectId(), firestoreOptions.getDatabaseId()))
          .apply(FirestoreIO.v1().read().runQuery().withReadTime(readTime).withRpcQosOptions(rpcQosOptions).build())
  ...

如需 Dataflow 管道中的完整 readTime 範例清單,請參閱 Github 存放區

從 PITR 資料匯出及匯入

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

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

  1. 匯出資料庫,並將 snapshot-time 參數指定為所選復原時間戳記。

    gcloud

    執行下列指令,將資料庫匯出至 bucket。

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

    其中

    • BUCKET_NAME_PATH - 有效的 Cloud Storage bucket,以及儲存匯出檔案的選用路徑前置字串。
    • PITR_TIMESTAMP - PITR 時間戳記,精細程度為分鐘,例如 2023-05-26T10:20:00.00Z2023-10-19T10:30:00.00-07:00
    • COLLECTION_IDS - 集合 ID 或集合群組 ID 清單,例如 -'specific-collection-group1','specific-collection-group2'
    • NAMESPACE_IDS - 命名空間 ID 清單,例如 -'customer','orders'

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

    • 請以 RFC 3339 格式指定時間戳記。例如 2023-05-26T10:20:00.00Z2023-10-19T10:30:00.00-07:00
    • 請確認指定的時間戳記是過去七天內的整分時間戳記,但不得早於 earliestVersionTime。如果指定時間戳記的資料已不存在,系統會產生錯誤。即使指定時間在過去一小時內,時間戳記也必須是整分鐘。
    • 如果 PITR 匯出作業失敗,您不需付費。
  2. 匯入資料庫。

    按照「匯入所有文件」一文中的步驟,匯入匯出的資料庫。如果資料庫中已有任何文件,系統會覆寫該文件。