Mit der Wiederherstellung zu einem bestimmten Zeitpunkt (Point-in-Time Recovery, PITR) arbeiten

Auf dieser Seite wird beschrieben, wie Sie mit der Wiederherstellung zu einem bestimmten Zeitpunkt (PITR) Daten in Firestore speichern und wiederherstellen.

Informationen zu den Konzepten der Wiederherstellung zu einem bestimmten Zeitpunkt finden Sie unter Wiederherstellung zu einem bestimmten Zeitpunkt.

Berechtigungen

Bitten Sie Ihren Administrator, Ihnen die Cloud Datastore-Inhaber (roles/datastore.owner) IAM-Rolle für das Projekt zu gewähren, dessen PITR-Einstellungen Sie aktivieren möchten, um die Berechtigungen zu erhalten, die Sie zum Verwalten der PITR-Einstellungen benötigen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierte Rolle enthält die Berechtigungen, die zum Verwalten der PITR-Einstellungen erforderlich sind. Maximieren Sie den Abschnitt Erforderliche Berechtigungen , um die notwendigen Berechtigungen anzuzeigen, die erforderlich sind:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind erforderlich, um PITR-Einstellungen zu verwalten:

  • Zum Aktivieren von PITR beim Erstellen einer Datenbank: datastore.databases.create
  • Zum Aktualisieren der PITR-Einstellungen für eine vorhandene Datenbank: datastore.databases.update,datastore.databases.list
  • Zum Ausführen von Lesevorgängen aus PITR-Daten: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • Zum Exportieren von PITR-Daten: datastore.databases.export
  • Zum Importieren von PITR-Daten: datastore.databases.import
  • Zum Klonen einer Datenbank: datastore.databases.clone

Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Hinweis

Beachten Sie die folgenden Punkte, bevor Sie PITR verwenden:

  • Sie können nicht sofort nach dem Aktivieren von PITR mit dem Lesen von Daten beginnen, die sieben Tage zurückliegen.
  • Wenn Sie PITR beim Erstellen einer Datenbank aktivieren möchten, müssen Sie den Befehl gcloud firestore databases create verwenden. Das Aktivieren von PITR beim Erstellen einer Datenbank mit der Google Cloud Console wird nicht unterstützt.
  • Firestore behält Versionen ab dem Zeitpunkt bei, an dem PITR aktiviert wird.
  • Nach dem Deaktivieren von PITR können Sie keine PITR-Daten im PITR-Fenster lesen.
  • Wenn Sie PITR sofort nach dem Deaktivieren wieder aktivieren, sind die vorherigen PITR-Daten nicht mehr verfügbar. Alle PITR-Daten, die vor dem Deaktivieren von PITR erstellt wurden, werden nach dem Ablaufdatum von PITR gelöscht.
  • Wenn Sie versehentlich Daten in der letzten Stunde gelöscht haben und PITR deaktiviert ist, können Sie Ihre Daten wiederherstellen, indem Sie PITR innerhalb einer Stunde nach dem Löschen aktivieren.
  • Alle Lesevorgänge für abgelaufene PITR-Daten schlagen fehl.

PITR aktivieren

Aktivieren Sie vor der Verwendung von PITR die Abrechnung für Ihr Google Cloud Projekt. Die PITR-Funktion kann nur für Google Cloud-Projekte mit aktivierter Abrechnung verwendet werden.

So aktivieren Sie PITR für Ihre Datenbank:

Console

  1. Rufen Sie in der Google Cloud Console die Seite Datenbanken auf.

    Zur Seite „Datenbanken“

  2. Wählen Sie die benötigte Datenbank aus der Liste der Datenbanken aus.

  3. Klicken Sie im Navigationsmenü auf Notfallwiederherstellung.

  4. Klicken Sie auf Bearbeiten , um die Einstellungen zu bearbeiten.

  5. Klicken Sie auf das Kästchen Wiederherstellung zu einem bestimmten Zeitpunkt aktivieren und dann auf Speichern.

Durch das Aktivieren von PITR fallen Speicherkosten an. Weitere Informationen finden Sie unter Preise.

Wenn Sie PITR deaktivieren möchten, entfernen Sie das Häkchen aus dem Kästchen Wiederherstellung zu einem bestimmten Zeitpunkt aktivieren auf der Seite „Notfallwiederherstellung“ in der Google Cloud Console.

gcloud

Aktivieren Sie PITR beim Erstellen der Datenbank mit den gcloud firestore databases create und dem --enable-ptir Befehl so:

gcloud firestore databases create\
  --location=LOCATION\
  --database=DATABASE_ID\
  --type=firestore-native\
  --enable-pitr

Ersetzen Sie die Werte so:

  • LOCATION : Der Standort, an dem Sie Ihre Datenbank erstellen möchten.
  • DATABASE_ID : Legen Sie eine Datenbank-ID fest.

Sie können PITR mit dem gcloud firestore databases update Befehl so deaktivieren:

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

Ersetzen Sie die Werte so:

  • DATABASE_ID : Legen Sie die Datenbank-ID oder `'(default)'` fest.

Aufbewahrungsdauer und Zeitstempel der ältesten Version abrufen

Console

  1. Rufen Sie in der Google Cloud Console die Seite Datenbanken auf.

    Zur Seite „Datenbanken“

  2. Wählen Sie die benötigte Datenbank aus der Liste der Datenbanken aus.

  3. Klicken Sie im Navigationsmenü auf Notfallwiederherstellung.

  4. Notieren Sie sich im Abschnitt Einstellungen die Werte für Aufbewahrungsdauer und Zeitstempel der ältesten Version.

    • Aufbewahrungsdauer: Der Zeitraum, in dem Firestore alle Datenversionen für die Datenbank beibehält. Der Wert beträgt eine Stunde, wenn PITR deaktiviert ist, und sieben Tage, wenn PITR aktiviert ist.
    • Zeitstempel der ältesten Version: Der früheste Zeitstempel, zu dem ältere Versionen von Daten im PITR-Fenster gelesen werden können. Dieser Wert wird von Firestore kontinuierlich aktualisiert und ist in dem Moment veraltet, in dem er abgefragt wird. Wenn Sie diesen Wert zur Wiederherstellung von Daten verwenden, müssen Sie die Zeit in dem Moment berücksichtigen, in dem der Wert abgefragt wird, bis zu dem Zeitpunkt, an dem Sie die Wiederherstellung initiieren.
    • Wiederherstellung zu einem bestimmten Zeitpunkt: Zeigt Enabled an, wenn PITR aktiviert ist. Wenn PITR deaktiviert ist, wird Disabled angezeigt.

gcloud

Führen Sie den Befehl gcloud firestore databases describe so aus:

gcloud firestore databases describe --database=DATABASE_ID

Ersetzen Sie DATABASE_ID durch die Datenbank-ID oder '(default)'.

Hier ist die Ausgabe:

    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

Dabei gilt:

  • earliestVersionTime: Zeitstempel der frühesten gespeicherten PITR-Daten.
  • pointInTimeRecoveryEnablement: Zeigt POINT_IN_TIME_RECOVERY_ENABLED an, wenn PITR aktiviert ist. Wenn PITR deaktiviert ist, wird entweder POINT_IN_TIME_RECOVERY_DISABLED angezeigt oder das Feld pointInTimeRecoveryEnablement wird nicht angezeigt.
  • versionRetentionPeriod: Zeitraum, in dem PITR-Daten in Millisekunden aufbewahrt werden. Der Wert kann eine Stunde sein, wenn PITR deaktiviert ist, oder sieben Tage, wenn PITR aktiviert ist.

PITR-Daten lesen

Sie können PITR-Daten mit den Clientbibliotheken, REST API-Methoden oder dem FirestoreIO Apache Beam-Connector lesen.

Clientbibliotheken

Java

Sie müssen die Transaktion ReadOnly verwenden, um PITR-Daten zu lesen. Sie können readTime nicht direkt in Lesevorgängen angeben. Weitere Informationen finden Sie unter Transaktionen und Batch-Schreibvorgänge.

  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();

Knoten

Sie müssen eine ReadOnly-Transaktion verwenden, um PITR-Daten zu lesen. Sie können readTime nicht direkt in Lesevorgängen angeben. Weitere Informationen finden Sie unter Transaktionen und Batch-Schreibvorgänge.

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

PITR-Lesevorgänge werden in allen Firestore-Lesemethoden unterstützt, nämlich get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery und partitionQuery.

Wenn Sie einen Lesevorgang mit den REST-Methoden ausführen möchten, haben Sie folgende Möglichkeiten:

  1. Übergeben Sie in Ihrer Anfrage für die Lesemethode den Wert readTime als unterstützten PITR-Zeitstempel in der Methode readOptions. Ein PITR-Zeitstempel kann entweder ein Zeitstempel mit Mikrosekundenpräzision innerhalb der letzten Stunde oder ein Zeitstempel mit ganzen Minuten außerhalb der letzten Stunde sein, aber nicht früher als earliestVersionTime.

  2. Verwenden Sie den readTime Parameter zusammen mit der BeginTransaction Methode als Teil einer ReadOnly Transaktion für mehrere Wiederherstellung zu einem bestimmten Zeitpunkt-Lesevorgänge.

Apache Beam

Verwenden Sie den FirestoreIO Apache Beam-Connector, um Dokumente in einer Firestore-Datenbank im großen Maßstab mit Dataflow zu lesen oder zu schreiben.

PITR-Lesevorgänge werden in der folgenden Lesemethode des FirestoreIO-Connectors unterstützt. Diese Lesemethoden unterstützen die Methode withReadTime(@Nullable Instant readTime), die Sie für PITR-Lesevorgänge verwenden können:

Java

Der folgende Code kann mit dem Beispielcode für die Dataflow-Pipeline für Bulk-Lese- oder -Schreibvorgänge verwendet werden. Im Beispiel wird die Methode withReadTime(@Nullable Instant readTime) für PITR-Lesevorgänge verwendet.

  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())
  ...

Eine vollständige Liste der readTime Beispiele in der Dataflow Pipeline finden Sie im GitHub-Repository.

Aus einer Datenbank klonen

Sie können eine vorhandene Datenbank zu einem ausgewählten Zeitstempel in eine neue Datenbank klonen:

  • Die geklonte Datenbank ist eine neue Datenbank, die am selben Standort wie die Quelldatenbank erstellt wird.

    Zum Erstellen eines Klons verwendet Firestore Daten für die Wiederherstellung zu einem bestimmten Zeitpunkt (PITR) der Quelldatenbank. Die geklonte Datenbank enthält alle Daten und Indexe.

  • Standardmäßig wird die geklonte Datenbank auf dieselbe Weise wie die Quelldatenbank verschlüsselt, entweder mit der Standardverschlüsselung von Google oder mit der CMEK-Verschlüsselung. Sie können einen anderen Verschlüsselungstyp angeben oder einen anderen Schlüssel für die CMEK-Verschlüsselung verwenden.

  • Der Zeitstempel hat eine Granularität von einer Minute und gibt einen Zeitpunkt in der Vergangenheit an, im Zeitraum, der durch das PITR-Fensterdefiniert ist:

    • Wenn PITR für Ihre Datenbank aktiviert ist, können Sie eine beliebige Minute in den letzten 7 Tagen auswählen (oder weniger, wenn PITR vor weniger als 7 Tagen aktiviert wurde).
    • Wenn PITR nicht aktiviert ist, können Sie eine beliebige Minute in der letzten Stunde auswählen.
    • Den frühesten Zeitstempel, den Sie auswählen können, finden Sie in der Beschreibung Ihrer Datenbank.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Datenbanken auf.

    Zur Seite „Datenbanken“

  2. Klicken Sie in der Tabellenzeile für die Datenbank, die Sie klonen möchten, auf Weitere Optionen. Klicken Sie auf Klonen. Das Dialogfeld Klon erstellen wird angezeigt.

  3. Geben Sie im Dialogfeld Klon erstellen die Parameter für das Klonen der Datenbank an:

    1. Geben Sie im Feld Klon eine ID zuweisen eine Datenbank-ID für eine neue geklonte Datenbank ein. Diese Datenbank-ID darf nicht mit einer vorhandenen Datenbank verknüpft sein.

    2. Wählen Sie im Feld Klonen ab einen Zeitpunkt für das Klonen aus. Die ausgewählte Zeit entspricht einem PITR-Zeitstempel mit einer Granularität von einer Minute.

  4. Klicken Sie auf Klon erstellen.

gcloud

Verwenden Sie den gcloud firestore databases clone Befehl, um eine Datenbank zu klonen:

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

Ersetzen Sie Folgendes:

  • SOURCE_DATABASE: Der Datenbankname einer vorhandenen Datenbank, die Sie klonen möchten. Der Name hat das Format projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.

  • PITR_TIMESTAMP: Ein PITR-Zeitstempel im RFC 3339-Format mit einer Granularität von einer Minute. Beispiel: 2025-06-01T10:20:00.00Z oder 2025-06-01T10:30:00.00-07:00.

  • DESTINATION_DATABASE_ID: Eine Datenbank-ID für eine neue geklonte Datenbank. Diese Datenbank-ID darf nicht mit einer vorhandenen Datenbank verknüpft sein.

Beispiel:

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

Wenn Sie beim Klonen einer Datenbank einige Tags binden möchten, verwenden Sie den vorherigen Befehl mit dem Flag --tags. Dies ist eine optionale Liste von Tags im Format „SCHLÜSSEL=WERT“, die gebunden werden sollen.

Beispiel:

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

Standardmäßig hat die geklonte Datenbank die gleiche Verschlüsselungskonfiguration wie die Quelldatenbank. Verwenden Sie das Argument --encryption-type, um die Verschlüsselungskonfiguration zu ändern:

  • (Standard) use-source-encryption: Verwenden Sie dieselbe Verschlüsselungskonfiguration wie die Quelldatenbank.
  • google-default-encryption: Verwenden Sie die Standardverschlüsselung von Google.
  • customer-managed-encryption: Verwenden Sie die CMEK-Verschlüsselung. Geben Sie eine Schlüssel-ID im --kms-key-name Argument an.

Das folgende Beispiel zeigt, wie Sie die CMEK-Verschlüsselung für die geklonte Datenbank konfigurieren:

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

Firebase CLI

Verwenden Sie den Befehl firebase firestore:databases:clone, um eine Datenbank zu klonen:

firebase firestore:databases:clone \
'SOURCE_DATABASE' \
'DESTINATION_DATABASE' \
--snapshot-time 'PITR_TIMESTAMP'

Ersetzen Sie Folgendes:

  • SOURCE_DATABASE: Der Datenbankname einer vorhandenen Datenbank, die Sie klonen möchten. Der Name hat das Format projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.

  • DESTINATION_DATABASE: Ein Datenbankname für eine neue geklonte Datenbank. Der Name hat das Format projects/PROJECT_ID/databases/DESTINATION_DATABASE_ID. Dieser Datenbankname darf nicht mit einer vorhandenen Datenbank verknüpft sein.

  • PITR_TIMESTAMP: Ein PITR-Zeitstempel im RFC 3339-Format mit einer Granularität von einer Minute. Beispiel: 2025-06-01T10:20:00.00Z oder 2025-06-01T10:30:00.00-07:00. Wenn nicht angegeben, ist der ausgewählte Snapshot die aktuelle Zeit, abgerundet auf die Minute.

Standardmäßig hat die geklonte Datenbank die gleiche Verschlüsselungskonfiguration wie die Quelldatenbank. Verwenden Sie das Argument --encryption-type, um die Verschlüsselungskonfiguration zu ändern:

  • (Standard) USE_SOURCE_ENCRYPTION: Verwenden Sie dieselbe Verschlüsselungskonfiguration wie die Quelldatenbank.
  • GOOGLE_DEFAULT_ENCRYPTION: Verwenden Sie die Standardverschlüsselung von Google.
  • CUSTOMER_MANAGED_ENCRYPTION: Verwenden Sie die CMEK-Verschlüsselung. Geben Sie eine Schlüssel-ID im --kms-key-name Argument an.

Das folgende Beispiel zeigt, wie Sie die CMEK-Verschlüsselung für die geklonte Datenbank konfigurieren:

firebase firestore:databases:clone \
'projects/example-project/databases/(default)' \
'projects/example-project/databases/example-dest-db' \
--snapshot-time 'PITR_TIMESTAMP' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION

Beschränkungen

Bei einem Klonvorgang werden keine App Engine-Suchdaten oder Blob-Entitäten aus einer (default)-Datenbank geklont. Diese Daten sind nur für die (default)-Datenbank gültig und sind nicht nützlich, wenn Sie von (default) in eine Datenbank klonen, die solche Daten nicht unterstützt. Daher werden sie aus Klonen ausgeschlossen.

Aus PITR-Daten exportieren und importieren

Sie können Ihre Datenbank mit dem gcloud firestore export Befehl aus PITR-Daten in Cloud Storage exportieren. Sie können PITR-Daten exportieren, deren Zeitstempel ein Zeitstempel mit ganzen Minuten innerhalb der letzten sieben Tage ist, aber nicht früher als earliestVersionTime. Wenn zum angegebenen Zeitstempel keine Daten mehr vorhanden sind, schlägt der Exportvorgang fehl.

Der PITR-Exportvorgang unterstützt alle Filter, einschließlich des Exports aller Dokumente und des Exports bestimmter Sammlungen.

  1. Exportieren Sie die Datenbank und geben Sie für den Parameter snapshot-time den ausgewählten Wiederherstellungszeitstempel an.

    gcloud

    Führen Sie den folgenden Befehl aus, um die Datenbank in Ihren Bucket zu exportieren.

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

    Dabei gilt:

    • BUCKET_NAME_PATH : Ein gültiger Cloud Storage-Bucket mit einem optionalen Pfadpräfix, in dem Exportdateien gespeichert werden.
    • PITR_TIMESTAMP : Ein PITR-Zeitstempel mit einer Granularität von einer Minute, z. B. 2023-05-26T10:20:00.00Z oder 2023-10-19T10:30:00.00-07:00.
    • COLLECTION_IDS : Eine Liste von Sammlungs-IDs oder Sammlungsgruppen-IDs, z. B. 'specific-collection-group1','specific-collection-group2'.
    • NAMESPACE_IDS : Eine Liste von Namespace-IDs, z. B. 'customer','orders'.

    Beachten Sie die folgenden Punkte, bevor Sie PITR-Daten exportieren:

    • Geben Sie den Zeitstempel im RFC 3339 Format an. Beispiel: 2023-05-26T10:20:00.00Z oder 2023-10-19T10:30:00.00-07:00.
    • Achten Sie darauf, dass der von Ihnen angegebene Zeitstempel ein Zeitstempel mit ganzen Minuten innerhalb der letzten sieben Tage ist, aber nicht früher als earliestVersionTime. Wenn zum angegebenen Zeitstempel keine Daten mehr vorhanden sind, wird ein Fehler generiert. Der Zeitstempel muss eine ganze Minute sein, auch wenn die angegebene Zeit innerhalb der letzten Stunde liegt.
    • Für einen fehlgeschlagenen PITR-Export werden keine Gebühren erhoben.
  2. In eine Datenbank importieren.

    Folgen Sie der Anleitung unter Alle Dokumente importieren, um Ihre exportierte Datenbank zu importieren. Wenn in Ihrer Datenbank bereits Dokumente vorhanden sind, werden sie überschrieben.