ポイントインタイム リカバリ(PITR)の操作

このページでは、ポイントインタイム リカバリ(PITR)を使用して、MongoDB 互換性のある Firestore でデータを保持、復元する方法について説明します。

PITR のコンセプトを理解するには、ポイントインタイム リカバリをご覧ください。

権限

PITR 設定を管理するために必要な権限を取得するには、PITR 設定を有効にするプロジェクトに対する Cloud Datastore オーナー roles/datastore.owner)の IAM ロール付与を管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

この事前定義ロールには、PITR 設定の管理に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

PITR 設定を管理するには、次の権限が必要です。

  • データベース作成時の PITR の有効化: datastore.databases.create
  • 既存のデータベースの PITR 設定の更新: datastore.databases.update,datastore.databases.list
  • PITR データからの読み取りの実行: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • PITR データのエクスポート: datastore.databases.export
  • PITR データのインポート: datastore.databases.import
  • データベースのクローンを作成するには: datastore.databases.clone

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

始める前に

PITR の使用を開始する前に、次の点に注意してください。

  • PITR を有効にした直後は、7 日前からの読み取りを開始できません。
  • データベース作成時の PITR を有効にする場合は、gcloud firestore databases create コマンドを使用する必要があります。 Google Cloud コンソールを使用してデータベースを作成するときに PITR を有効にすることはできません。
  • MongoDB 互換の Firestore では、PITR を有効にした後、その時点からのバージョンの保持を開始します。
  • PITR を無効にすると、PITR データの保持期間内であっても PITR データを読み取ることができなくなります。
  • PITR を無効にした直後に再度有効にした場合、過去の PITR データは使用できなくなります。PITR を無効にする前に作成された PITR データは、PITR の有効期限の後に削除されます。
  • 過去 1 時間以内に誤ってデータを削除し、PITR が無効になっている場合は、削除後 1 時間以内であれば PITR を有効にするとデータを復元できます。
  • 期限切れの PITR データに対する読み取りはすべて失敗します。

PITR を有効にする

PITR を使用する前に、Google Cloud プロジェクトに対する課金を有効にします。PITR 機能を使用できるのは、課金が有効になっている Google Cloud プロジェクトのみです。

データベースの PITR を有効にするには:

コンソール

  1. Google Cloud コンソールで、[データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストから、必要なデータベースを選択します。

  3. ナビゲーション メニューで、[障害復旧] をクリックします。

  4. [編集] をクリックして設定を編集します。

  5. [ポイントインタイム リカバリを有効にする] チェックボックスをオンにして、[保存] をクリックします。

PITR を有効にすると、ストレージの費用が発生します。詳細は料金をご覧ください。

PITR を無効にするには、 Google Cloud コンソールの [障害復旧] ページで [ポイントインタイム リカバリを有効にする] チェックボックスをオフにします。

gcloud

次のように gcloud firestore databases create コマンドと --enable-ptir コマンドを使用して、データベース作成時の PITR を有効にします。

gcloud firestore databases create\
  --location=LOCATION\
  --database=DATABASE_ID\
  --edition=enterprise\
  --enable-pitr

次のように置き換えます。

  • LOCATION - データベースを作成するロケーション。
  • DATABASE_ID - データベース ID に設定します。

PITR を無効にするには、次のように gcloud firestore databases update コマンドを使用します。

gcloud firestore databases update\
  --database=DATABASE_ID\
  --no-enable-pitr

次のように置き換えます。

  • DATABASE_ID - データベース ID または(default)に設定します。

保持期間と最短版の時間を取得する

コンソール

  1. Google Cloud コンソールで、[データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストから、必要なデータベースを選択します。

  3. ナビゲーション メニューで、[障害復旧] をクリックします。

  4. [設定] セクションの [保持期間] と [最も古いバージョンの時刻] をメモします。

    • 保持期間: MongoDB 互換の Firestore がデータベースのすべてのバージョンのデータを保持する期間。この値は、PITR が無効になっている場合は 1 時間、PITR が有効になっている場合は 7 日間です。
    • 最も古いバージョンの時刻: PITR 期間で古いバージョンのデータを読み取ることができる最も古いタイムスタンプ。この値は MongoDB 互換の 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 が無効になっている場合は 1 時間、PITR が有効になっている場合は 7 日間になります。

PITR データを読み取る

さまざまな MongoDB クライアント ドライバで、スナップショット セッションを使用して PITR データを読み取ることができます。セッションに snapshotTimestamp を設定します。次の例では MongoDB Java ドライバを使用していますが、他のドライバでも同様の機能を利用できます。

Java

    var session =
        mongoClient.startSession(ClientSessionOptions.builder().snapshot(true).build());
  session.setSnapshotTimestamp(new BsonTimestamp(seconds, nanos));

  // run a find query with PITR timestamp
  collection.find(session, <filter>).toList();

  // run an aggregation query pipeline with PITR timestamp
  collection.aggregate(session, <aggregation pipeline stages>).toList();

  // run distinct command with PITR timestamp
  collection.distinct(session, <field>, <return value type class>).toList();

MongoDB では、BsonTimestamp は MongoDB 内部専用の 64 ビットの BSON 型です。最初の 32 ビットはエポック タイムスタンプの秒数を表し、後の 32 ビットは MongoDB クラスタ内の順序オペレーション数を表します。

MongoDB 互換の Firestore では、スナップショットのタイムスタンプ(BsonTimestamp 値型を使用)は、最初の 32 ビットをエポック タイムスタンプの秒として解釈しますが、後の 32 ビットは秒内のナノ秒として解釈します。ナノ秒 PITR スナップショットがすべてサポートされているわけではありません。過去 1 時間以内のマイクロ秒単位のタイムスタンプと、過去 7 日間の 1 分単位のタイムスタンプが許可されます。サポートされている読み取りタイムスタンプについては、ポイントインタイム リカバリ(PITR)の概要をご覧ください。

PITR データからエクスポートおよびインポートする

gcloud firestore export コマンドを使用すると、PITR データから Cloud Storage にデータベースをエクスポートできます。タイムスタンプが過去 7 日以内(ただし earliestVersionTime 以降)の 1 分単位の場合は、PITR データをエクスポートできます。指定したタイムスタンプにデータがもう存在しない場合、エクスポート オペレーションは失敗します。

PITR エクスポート オペレーションでは、すべてのドキュメントのエクスポート、特定のコレクションのエクスポートなど、すべてのフィルタがサポートされています。

  1. snapshot-time パラメータを選択したリカバリ タイムスタンプに指定して、データベースをエクスポートします。

    gcloud

    次のコマンドを実行して、データベースをバケットにエクスポートします。

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

    次のように置き換えます。

    • BUCKET_NAME_PATH - エクスポート ファイルが保存される有効な Cloud Storage バケット(パス接頭辞は省略可能)。
    • PITR_TIMESTAMP - 分単位の PITR タイムスタンプ(例: 2023-05-26T10:20:00.00Z または 2023-10-19T10:30:00.00-07:00)。
    • COLLECTION_IDS - コレクション ID またはコレクション グループ ID のリスト(例: 'specific-collection-group1','specific-collection-group2')。

    PITR データをエクスポートする前に、次の点に注意してください。

    • RFC 3339 形式でタイムスタンプを指定しますたとえば、2023-05-26T10:20:00.00Z2023-10-19T10:30:00.00-07:00 です。
    • タイムスタンプは、過去 7 日間以内(ただし earliestVersionTime 以降)の 1 分単位のタイムスタンプを指定する必要があります。指定したタイムスタンプにデータが存在しない場合、エラーが発生します。指定した時間が過去 1 時間以内の場合でも、タイムスタンプは 1 分単位にする必要があります。
    • 失敗した PITR エクスポートについては課金されません。
  2. データベースにインポートします。

    すべてのドキュメントをインポートする手順に沿って、エクスポートしたデータベースをインポートします。データベースにすでにドキュメントが存在する場合は上書きされます。

データベースからクローンを作成する

選択したタイムスタンプの既存のデータベースを新しいデータベースにクローン作成できます。

  • クローン作成されたデータベースは、ソース データベースと同じロケーションに作成される新しいデータベースです。

    クローンを作成するために、Firestore はソース データベースのポイントインタイム リカバリ(PITR)データを使用します。クローンデータベースには、すべてのデータとインデックスが含まれます。

  • デフォルトでは、クローン作成されたデータベースは、Google のデフォルトの暗号化または CMEK 暗号化を使用して、ソース データベースと同じ方法で暗号化されます。別の暗号化タイプを指定するか、CMEK 暗号化に別の鍵を使用できます。

  • タイムスタンプの粒度は 1 分で、PITR ウィンドウで定義された期間内の過去の時点を指定します。

    • データベースで PITR が有効になっている場合は、過去 7 日間の任意の分を選択します(PITR が 7 日前より短い時点で有効になった場合は、それより短い期間になります)。
    • PITR が有効になっていない場合は、過去 1 時間の任意の分を選択できます。
    • 選択できる最も古いタイムスタンプは、データベースの説明で確認できます。

コンソール

  1. Google Cloud コンソールで、[データベース] ページに移動します。

    [データベース] に移動

  2. 複製するデータベースのテーブル行にある [さらに表示] をクリックします。[Clone] をクリックします。[クローンを作成] ダイアログが表示されます。

  3. [クローンを作成] ダイアログで、データベースのクローンを作成するためのパラメータを指定します。

    1. [クローンの ID を設定] フィールドに、新しいクローン データベースのデータベース ID を入力します。このデータベース ID を、既存のデータベースに関連付けることはできません。

    2. [クローン元] フィールドで、クローニングに使用する時点を選択します。選択した時間は、分単位の PITR タイムスタンプに対応します。

  4. [クローンを作成] をクリックします。

gcloud

gcloud alpha firestore databases clone コマンドを使用して、データベースのクローンを作成します。

gcloud alpha firestore databases clone \
--source-database='SOURCE_DATABASE' \
--snapshot-time='PITR_TIMESTAMP' \
--destination-database='DESTINATION_DATABASE_ID'

次のように置き換えます。

  • SOURCE_DATABASE: クローンを作成する既存のデータベースのデータベース名。名前の形式は projects/PROJECT_ID/databases/SOURCE_DATABASE_ID です。

  • PITR_TIMESTAMP: 分単位の RFC 3339 形式PITR タイムスタンプ。たとえば、2025-06-01T10:20:00.00Z2025-06-01T10:30:00.00-07:00 です。

  • DESTINATION_DATABASE_ID: クローン作成された新しいデータベースのデータベース ID。このデータベース ID を、既存のデータベースに関連付けることはできません。

例:

gcloud alpha firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='projects/example-project/databases/example-dest-db'

クローン作成されたデータベースの暗号化構成を変更する

デフォルトでは、クローン作成されたデータベースはソース データベースと同じ暗号化構成になります。暗号化構成を変更するには、--encryption-type 引数を使用します。

  • (デフォルト)use-source-encryption: ソース データベースと同じ暗号化構成を使用します。
  • google-default-encryption: Google のデフォルトの暗号化を使用
  • customer-managed-encryption: CMEK 暗号化を使用します。--kms-key-name 引数でキー ID を指定します。

次の例は、クローン作成されたデータベースの CMEK 暗号化を構成する方法を示しています。

gcloud alpha firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='projects/example-project/databases/example-dest-db' \
--encryption-type='customer-managed-encryption' \
--kms-key-name='projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key'