Mit der Wiederherstellung zu einem bestimmten Zeitpunkt arbeiten

Auf dieser Seite wird beschrieben, wie Sie die Wiederherstellung zu einem bestimmten Zeitpunkt (Point-in-Time Recovery, PITR) verwenden, um Daten in Firestore im Datastore-Modus aufzubewahren und wiederherzustellen.

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

Berechtigungen

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

Diese vordefinierte Rolle enthält Berechtigungen zum Verwalten der PITR-Einstellungen Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die erforderlichen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

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

  • So aktivieren Sie die PITR beim Erstellen einer Datenbank: datastore.databases.create
  • So aktualisieren Sie die PITR-Einstellungen in einer vorhandenen Datenbank: datastore.databases.update,datastore.databases.list
  • So führen Sie Lesevorgänge aus PITR-Daten aus: datastore.databases.get,datastore.entities.get,datastore.entities.list,datastore.namespaces.get,datastore.namespaces.list,datastore.statistics.get,datastore.statistics.list
  • So exportieren Sie PITR-Daten: datastore.databases.export
  • So importieren Sie PITR-Daten: datastore.databases.import

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

Hinweis

Beachten Sie die folgenden Punkte, bevor Sie mit der Verwendung der PITR beginnen:

  • Sie können nicht sofort nach der Aktivierung der PITR-Datenwiederherstellung 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 über die Google Cloud Console wird nicht unterstützt.
  • Ab dem Zeitpunkt werden im Datastore-Modus Versionen beibehalten, nachdem PITR aktivieren.
  • Nachdem Sie PITR deaktiviert haben, können Sie keine PITR-Daten im PITR-Fenster mehr lesen.
  • Wenn Sie PITR sofort nach der Deaktivierung wieder aktivieren, sind die bisherigen 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 in der letzten Stunde versehentlich Daten gelöscht haben und PITR deaktiviert ist, können Sie sie wiederherstellen, indem Sie PITR innerhalb einer Stunde nach dem Löschen aktivieren.
  • Jeder Lesevorgang, der an abgelaufenen PITR-Daten ausgeführt wird, schlägt fehl.

PITR aktivieren

Bevor Sie PITR verwenden können, müssen Sie die Abrechnung für Ihr Google Cloud-Projekt aktivieren. Nur Google Cloud-Projekte mit aktivierter Abrechnung können die PITR-Funktion verwenden.

So aktivieren Sie die 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.

Für das Aktivieren der PITR fallen Speicherkosten an. Weitere Informationen finden Sie unter Preise.

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

gcloud

Aktivieren Sie PITR während der Datenbankerstellung mit dem Befehl gcloud firestore databases create:

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

Ersetzen Sie die Werte so:

  • LOCATION: Ort, an dem Sie die Datenbank erstellen möchten.
  • DATABASE_ID – auf die Datenbank-ID oder (Standardeinstellung) festgelegt.
  • TYPE – auf „datastore-mode“ festgelegt.

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

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

Ersetzen Sie die Werte so:

  • DATABASE_ID – auf die Datenbank-ID oder (Standardeinstellung) festlegen

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 Bereich Einstellungen die Aufbewahrungsdauer und den Zeitstempel der ältesten Version.

    • Aufbewahrungsdauer: Der Zeitraum, in dem im Datastore-Modus alle Datenversionen für die Datenbank beibehalten werden. Der Wert beträgt eine Stunde, wenn die PITR deaktiviert und 7 Tage, wenn die Wiederherstellung zu einem bestimmten Zeitpunkt aktiviert ist.
    • Zeitstempel der ältesten Version: der früheste Zeitstempel, zu dem frühere Versionen der Daten im PITR-Fenster gelesen werden können. Dieser Wert wird vom Datastore-Modus kontinuierlich aktualisiert und ist in dem Moment veraltet, in dem er abgefragt wird. Wenn Sie diesen Wert für die Wiederherstellung von Daten verwenden, berücksichtigen Sie die Zeit vom den Moment, in dem der Wert bis zu dem Moment abgefragt wird, in dem Sie Genesung.
    • Wiederherstellung zu einem bestimmten Zeitpunkt: Wird Enabled angezeigt, wenn die Wiederherstellung zu einem bestimmten Zeitpunkt aktiviert ist. Ist die PITR deaktiviert, sehen Sie Disabled

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/(default)
    pointInTimeRecoveryEnablement: POINT_IN_TIME_RECOVERY_DISABLED
    type: DATASTORE_MODE
    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, falls PITR aktiviert ist. Ist die Wiederherstellung zu einem bestimmten Zeitpunkt deaktiviert, sehen Sie entweder POINT_IN_TIME_RECOVERY_DISABLED oder die pointInTimeRecoveryEnablement wird möglicherweise nicht angezeigt.
  • versionRetentionPeriod: Zeitraum, in dem PITR-Daten gespeichert werden Millisekunden. Der Wert kann eine Stunde betragen, wenn PITR deaktiviert ist, oder sieben Tage, wenn PITR aktiviert ist.

PITR-Daten lesen

Sie können PITR-Daten mithilfe der Clientbibliotheken, REST API-Methoden oder des FirestoreIO Apache Beam-Connectors lesen.

Clientbibliotheken

Java

Zum Lesen von PITR-Daten müssen Sie die Methode readTime in der Klasse ReadOption verwenden. Sie können die ReadOnly-Transaktion nicht für Lesevorgänge verwenden. Weitere Informationen finden Sie unter ReadOption-Beispielcode.

  Datastore datastore = ...
  Timestamp timestamp = ...

  // lookup
  Key key = ...
  Entity entity = datastore.get(key, ReadOption.readTime(timestamp));

  // runQuery
  Query<Entity> query = ...
  QueryResults<Entity> queryResult = datastore.run(query, ReadOption.readTime(timestamp));

  // runAggregationQuery
  AggregationQuery countAggregationQuery = ...
  Long count = getOnlyElement(datastore.runAggregation(countAggregationQuery, ReadOption.readTime(timestamp))).get("total_count");

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

Python

Verwenden Sie die PITR-Lesefunktion im Datastore-Modus des Python SDK mit der Methode readTime oder die ReadOnly-Transaktion mit readTime, um Lesevorgänge auszuführen.

  from datetime import datetime, timezone

  read_time = datetime.now(tz=timezone.utc)

  key = 
  # read without PITR read time
  entity = client.get(key)

  # read with PITR read time
  entity = client.get(key, read_time=read_time)

  # PITR read using read_only transaction
  with client.transaction(read_only=True, read_time=read_time):
      entity = client.get(key)

  query = client.query
  # run query without PITR read time
  iterator = query.fetch()

  # run query with PITR read time
  iterator = query.fetch(read_time=read_time)

  # PITR read query using read_only transaction
  with client.transaction(read_only=True, read_time=read_time):
      iterator = query.fetch()

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

REST API

PITR-Lesungen werden von den Lesemethoden des Datastore-Modus V1 unterstützt: lookup, runQuery und runAggregationQuery.

Sie haben folgende Möglichkeiten, eine Leseoperation mit den REST-Methoden auszuführen:

  1. Geben Sie in der Anfrage für die Lesemethode den Wert readTime als unterstützten PITR-Zeitstempel in der Methode readOptions an. Ein PITR-Zeitstempel kann entweder ein Zeitstempel mit Mikrosekundengenauigkeit innerhalb der letzten Stunde oder ein Zeitstempel einer ganzen Minute nach der letzten Stunde sein, aber nicht vor earliestVersionTime.

  2. Verwenden Sie den Parameter readTime zusammen mit der Methode BeginTransaction als Teil einer ReadOnly-Transaktion für mehrere PITR-Lesungen.

Apache Beam

Mit dem Apache Beam-IO-Connector für den Datastore-Modus können Sie mit Dataflow Entitäten in einer Datastore-Datenbank im großen Maßstab lesen oder schreiben.

Geben Sie die Methode withReadTime(Instant readTime) für das Objekt DatastoreV1.Read an. Alle nachfolgenden Lesevorgänge mit dem Objekt DatastoreV1.Read lesen aus derselben readTime.

Java

Im folgenden Code wird gezeigt, wie die Methode withReadTime für PITR-Lesungen verwendet wird.

  com.google.datastore.v1.Query query = ...
    Instant readTime = Instant.ofEpochSecond(1684098540L);

    DatastoreV1.Read read =
            DatastoreIO.v1()
                .read()
                .withProjectId(project)
                .withQuery(query)
                .withNamespace(namespace)
                .withReadTime(readTime);

    PCollection<Entity> entities = pipeline.apply(read);
    ...

Eine vollständige Liste der withReadTime-Beispiele finden Sie im GitHub.

Export und Import aus PITR-Daten

Sie können Ihre Datenbank aus PITR-Daten nach Cloud Storage exportieren mit dem Befehl gcloud firestore export. Sie können PITR-Daten exportieren, deren Zeitstempel auf eine volle Minute innerhalb der letzten sieben Tage festgelegt ist, jedoch nicht früher als der earliestVersionTime. Wenn die Daten nicht mehr zum angegebenen Zeitstempel existiert, schlägt der Exportvorgang fehl.

Der PITR-Exportvorgang unterstützt alle Filter, einschließlich des Exports aller Entitäten und bestimmte Arten oder Namespaces exportieren.

  1. Exportieren Sie die Datenbank und geben Sie dabei den Parameter snapshot-time für den erforderlichen 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 ist ein gültiger Cloud Storage-Bucket mit einem optionalen Pfadpräfix, in dem Exportdateien gespeichert werden.
    • PITR_TIMESTAMP: ein PITR-Zeitstempel mit minutengenauem Detaillierungsgrad, 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'.

    Es wird auch unterstützt, eine bestimmte Teilmenge von Arten und/oder Namespaces mit einem Entitätsfilter zu exportieren.

    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.00Zoder 2023-10-19T10:30:00.00-07:00
    • Achten Sie darauf, dass der von Ihnen angegebene Zeitstempel ein Zeitstempel für eine volle Minute innerhalb der letzten sieben Tage ist, aber nicht älter als der earliestVersionTime. Wenn zum angegebenen Zeitstempel keine Daten mehr vorhanden sind, erhalten Sie eine Fehlermeldung. Der Zeitstempel muss eine ganze Minute lang sein, auch wenn die angegebene Uhrzeit innerhalb der letzten Stunde liegt.
    • Für einen fehlgeschlagenen PITR-Export werden Ihnen keine Kosten in Rechnung gestellt.
  2. Import in eine Datenbank

    Folgen Sie der Anleitung unter Alle Entitäten importieren, um die exportierte Datenbank zu importieren. Wenn Entitäten bereits in Ihrer Datenbank vorhanden sind, werden sie überschrieben. Es wird auch unterstützt, eine bestimmte Teilmenge von Arten und/oder Namespaces mit einem Entitätsfilter zu importieren.