Praca z odzyskiwaniem do określonego momentu (PITR)

Z tej strony dowiesz się, jak używać odzyskiwania do określonego momentu (PITR) do przechowywania i odzyskiwania danych w Cloud Firestore.

Aby zrozumieć koncepcje PITR, przeczytaj artykuł Odzyskiwanie do określonego momentu.

Uprawnienia

Aby uzyskać uprawnienia potrzebne do zarządzania ustawieniami PITR, poproś administratora o przypisanie Ci w projekcie, w którym chcesz włączyć PITR, tych ról uprawnień:

  • Właściciel Cloud Datastore (roles/datastore.owner)

W przypadku ról niestandardowych upewnij się, że przyznano te uprawnienia:

  • Aby włączyć PITR podczas tworzenia bazy danych: datastore.databases.create
  • Aby zaktualizować ustawienia PITR w istniejącej bazie danych: datastore.databases.update,datastore.databases.list
  • Aby odczytywać dane PITR: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • Aby eksportować dane PITR: datastore.databases.export
  • Aby importować dane PITR: datastore.databases.import
  • Aby sklonować bazę danych: datastore.databases.clone

Zanim zaczniesz

Zanim zaczniesz korzystać z odzyskiwania do określonego momentu, zwróć uwagę na te kwestie:

  • Nie możesz zacząć odczytywać danych sprzed 7 dni od razu po włączeniu PITR.
  • Jeśli chcesz włączyć PITR podczas tworzenia bazy danych, musisz użyć polecenia gcloud firestore databases create. Włączenie PITR podczas tworzenia bazy danych za pomocą konsoli Google Cloud nie jest obsługiwane.
  • Cloud Firestore zaczyna przechowywać wersje od momentu włączenia PITR.
  • Po wyłączeniu PITR nie możesz odczytywać danych PITR w oknie PITR.
  • Jeśli ponownie włączysz PITR od razu po jego wyłączeniu, wcześniejsze dane PITR nie będą już dostępne. Wszystkie dane PITR utworzone przed wyłączeniem PITR zostaną usunięte po upływie daty ważności PITR.
  • Jeśli przypadkowo usuniesz dane w ciągu ostatniej godziny, a PITR jest wyłączone, możesz przywrócić dane, włączając PITR w ciągu godziny od usunięcia.
  • Każda próba odczytu wygasłych danych PITR nie powiedzie się.

Włączanie PITR

Zanim zaczniesz korzystać z PITR, włącz płatności w projekcie Google Cloud project. Z funkcji PITR mogą korzystać tylko projekty Google Cloud z włączonymi płatnościami.

Aby włączyć PITR w bazie danych:

Konsola

  1. W konsoli Google Cloud otwórz stronę Bazy danych.

    Otwórz stronę Bazy danych

  2. Na liście baz danych wybierz odpowiednią bazę danych.

  3. W menu nawigacyjnym kliknij Odtwarzanie awaryjne.

  4. Aby edytować ustawienia, kliknij Edytuj.

  5. Zaznacz pole wyboru Włącz odzyskiwanie do określonego momentu i kliknij Zapisz.

Włączenie PITR wiąże się z kosztami przechowywania. Więcej informacji znajdziesz w cenniku.

Aby wyłączyć PITR, odznacz pole wyboru Włącz odzyskiwanie do określonego momentu na stronie Odtwarzanie awaryjne w konsoli Google Cloud.

gcloud

Włącz PITR podczas tworzenia bazy danych za pomocą gcloud firestore databases create i polecenia --enable-ptir w ten sposób:

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

Zastąp wartości w ten sposób:

  • LOCATION – lokalizacja, w której chcesz utworzyć bazę danych.
  • DATABASE_ID – identyfikator bazy danych.

PITR możesz wyłączyć za pomocą polecenia gcloud firestore databases update w ten sposób:

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

Zastąp wartości w ten sposób:

  • DATABASE_ID – identyfikator bazy danych lub ` (default)`.

Pobieranie okresu przechowywania i najwcześniejszej wersji

Konsola

  1. W konsoli Google Cloud otwórz stronę Bazy danych.

    Otwórz stronę Bazy danych

  2. Na liście baz danych wybierz odpowiednią bazę danych.

  3. W menu nawigacyjnym kliknij Odtwarzanie awaryjne.

  4. W sekcji Ustawienia zanotuj Okres przechowywania i Najwcześniejsza wersja.

    • Okres przechowywania: okres, w którym Cloud Firestore przechowuje wszystkie wersje danych bazy danych. Gdy PITR jest wyłączone, wartość wynosi 1 godzinę, a gdy jest włączone – 7 dni.
    • Najwcześniejsza wersja: najwcześniejsza sygnatura czasowa, w której można odczytać starsze wersje danych w oknie odzyskiwania do określonego momentu. Ta wartość jest stale aktualizowana przez Cloud Firestore i staje się nieaktualna w momencie wysłania zapytania. Jeśli używasz tej wartości do odzyskiwania danych, uwzględnij czas od momentu wysłania zapytania do momentu rozpoczęcia odzyskiwania.
    • Odzyskiwanie do określonego momentu: jeśli PITR jest włączone, wyświetla się wartość Enabled. Jeśli PITR jest wyłączone, zobaczysz Disabled.

gcloud

Uruchom polecenie gcloud firestore databases describe w ten sposób:

gcloud firestore databases describe --database=DATABASE_ID

Zastąp DATABASE_ID identyfikatorem bazy danych lub '(default)'.

Oto dane wyjściowe:

    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

gdzie:

  • earliestVersionTime: sygnatura czasowa najwcześniejszych przechowywanych danych PITR.
  • pointInTimeRecoveryEnablement: jeśli PITR jest włączone, wyświetla się wartość POINT_IN_TIME_RECOVERY_ENABLED. Jeśli PITR jest wyłączone, zobaczysz POINT_IN_TIME_RECOVERY_DISABLED lub pole pointInTimeRecoveryEnablement może się nie wyświetlać.
  • versionRetentionPeriod: okres, przez który dane PITR są przechowywane w milisekundach. Wartość może wynosić 1 godzinę, gdy PITR jest wyłączone, lub 7 dni, gdy PITR jest włączone.

Odczytywanie danych PITR

Dane PITR możesz odczytywać za pomocą bibliotek klienta, metod interfejsu API typu REST lub oprogramowania sprzęgającego FirestoreIO Apache Beam.

Biblioteki klienta

Java

Aby odczytywać dane PITR, musisz użyć transakcji ReadOnly. Nie możesz bezpośrednio określić readTime w odczytach. Więcej informacji znajdziesz w artykule Transakcje i zapisywanie zbiorcze.

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

Węzeł

Aby odczytywać dane PITR, musisz użyć transakcji ReadOnly. Nie możesz bezpośrednio określić readTime w odczytach. Więcej informacji znajdziesz w artykule Transakcje i zapisywanie zbiorcze.

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

Interfejs API typu REST

Odczyty PITR są obsługiwane we wszystkich Cloud Firestore metodach odczytu, czyli get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery i partitionQuery.

Aby wykonać odczyt za pomocą metod REST, wypróbuj jedną z tych opcji:

  1. W żądaniu metody odczytu przekaż wartość readTime jako obsługiwaną sygnaturę czasową odzyskiwania do określonego momentu w metodzie readOptions. Sygnatura czasowa PITR może być sygnaturą czasową z dokładnością do mikrosekund w ciągu ostatniej godziny lub sygnaturą czasową z dokładnością do minuty poza ostatnią godziną, ale nie wcześniejszą niż earliestVersionTime.

  2. Użyj parametru readTime razem z metodą BeginTransaction w ramach transakcji ReadOnly w przypadku wielu odczytów PITR.

Apache Beam

Użyj oprogramowania sprzęgającego Cloud FirestoreIO Apache Beam, aby odczytywać lub zapisywać dokumenty w bazie danych Cloud Firestore na dużą skalę za pomocą Dataflow.

Odczyty PITR są obsługiwane w tej metodzie odczytu oprogramowania sprzęgającego Cloud FirestoreIO. Te metody odczytu obsługują metodę withReadTime(@Nullable Instant readTime), której możesz używać do odczytów PITR:

Java

Ten kod może być używany z przykładowym kodem potoku Dataflow do operacji odczytu lub zapisu zbiorczego. W przykładzie używana jest metoda withReadTime(@Nullable Instant readTime) do odczytów 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())
  ...

Pełną listę przykładów readTime w potoku Dataflow znajdziesz w repozytorium GitHub.

Klonowanie z bazy danych

Możesz sklonować istniejącą bazę danych w wybranej sygnaturze czasowej do nowej bazy danych:

  • Sklonowana baza danych to nowa baza danych, która zostanie utworzona w tej samej lokalizacji co źródłowa baza danych.

    Aby utworzyć klon, Cloud Firestore używa danych odzyskiwania do określonego momentu (PITR) źródłowej bazy danych. Sklonowana baza danych zawiera wszystkie dane i indeksy.

  • Domyślnie sklonowana baza danych będzie szyfrowana w ten sam sposób co źródłowa baza danych, czyli za pomocą domyślnego szyfrowania Google lub szyfrowania CMEK. Możesz określić inny typ szyfrowania lub użyć innego klucza do szyfrowania CMEK.

  • Sygnatura czasowa ma dokładność do minuty i określa punkt w czasie w przeszłości, w okresie zdefiniowanym przez okno PITR:

    • Jeśli PITR jest włączone w Twojej bazie danych, możesz wybrać dowolną minutę z ostatnich 7 dni (lub krócej, jeśli PITR zostało włączone mniej niż 7 dni temu).
    • Jeśli PITR nie jest włączone, możesz wybrać dowolną minutę z ostatniej godziny.
    • Najwcześniejszą sygnaturę czasową, którą możesz wybrać znajdziesz w opisie bazy danych.

Konsola

Firebase konsola nie obsługuje klonowania baz danych. Do klonowania baz danych możesz użyć instrukcji dotyczących Google Cloud CLI.

Google Cloud CLI

gcloud

Aby sklonować bazę danych, użyj polecenia gcloud firestore databases clone:

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

Zastąp następujące elementy:

Przykład:

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

Jeśli podczas klonowania bazy danych chcesz powiązać ją z tagami, użyj poprzedniego polecenia z flagą --tags, która jest opcjonalną listą tagów w postaci par KLUCZ=WARTOŚĆ.

Przykład:

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

Domyślnie sklonowana baza danych będzie miała taką samą konfigurację szyfrowania jak źródłowa baza danych. Aby zmienić konfigurację szyfrowania, użyj argumentu --encryption-type:

  • (Domyślnie) use-source-encryption: użyj tej samej konfiguracji szyfrowania co źródłowa baza danych.
  • google-default-encryption: użyj domyślnego szyfrowania Google.
  • customer-managed-encryption: użyj szyfrowania CMEK. Określ identyfikator klucza w argumencie --kms-key-name.

Ten przykład pokazuje, jak skonfigurować szyfrowanie CMEK dla sklonowanej bazy danych:

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'

wiersz poleceń Firebase

Aby sklonować bazę danych, użyj polecenia firebase firestore:databases:clone:

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

Zastąp następujące elementy:

  • SOURCE_DATABASE: nazwa istniejącej bazy danych, którą chcesz sklonować. Nazwa ma format projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.

  • DESTINATION_DATABASE: nazwa bazy danych dla nowej sklonowanej bazy danych. Nazwa ma format projects/PROJECT_ID/databases/DESTINATION_DATABASE_ID. Ta nazwa bazy danych nie może być powiązana z istniejącą bazą danych.

  • PITR_TIMESTAMP: sygnatura czasowa PITR w formacie RFC 3339, z dokładnością do minuty. Na przykład: 2025-06-01T10:20:00.00Z lub 2025-06-01T10:30:00.00-07:00. Jeśli nie określisz sygnatury czasowej, wybrany snapshot będzie odpowiadał bieżącej godzinie zaokrąglonej w dół do minuty.

Domyślnie sklonowana baza danych będzie miała taką samą konfigurację szyfrowania jak źródłowa baza danych. Aby zmienić konfigurację szyfrowania, użyj argumentu --encryption-type:

  • (Domyślnie) USE_SOURCE_ENCRYPTION: użyj tej samej konfiguracji szyfrowania co źródłowa baza danych.
  • GOOGLE_DEFAULT_ENCRYPTION: użyj domyślnego szyfrowania Google.
  • CUSTOMER_MANAGED_ENCRYPTION: użyj szyfrowania CMEK. Określ identyfikator klucza w argumencie --kms-key-name.

Ten przykład pokazuje, jak skonfigurować szyfrowanie CMEK dla sklonowanej bazy danych:

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

Ograniczenia

Operacja klonowania nie klonuje App Engine danych wyszukiwania ani encji blob z bazy danych (default). Te dane są ważne tylko w przypadku bazy danych (default) i nie będą przydatne, jeśli sklonujesz bazę danych (default) do bazy danych, która nie obsługuje takich danych. Dlatego są one wykluczone z klonów.

Eksportowanie i importowanie danych PITR

Za pomocą polecenia gcloud firestore export możesz wyeksportować bazę danych do Cloud Storage z danych PITR. Możesz wyeksportować dane PITR, których sygnatura czasowa jest sygnaturą czasową z dokładnością do minuty w ciągu ostatnich 7 dni, ale nie wcześniejszą niż earliestVersionTime. Jeśli dane nie istnieją już w określonej sygnaturze czasowej, operacja eksportu nie powiedzie się.

Operacja eksportu PITR obsługuje wszystkie filtry, w tym eksport wszystkich dokumentów i eksport określonych kolekcji.

  1. Wyeksportuj bazę danych, określając parametr snapshot-time jako wybraną sygnaturę czasową odzyskiwania.

    gcloud

    Aby wyeksportować bazę danych do zasobnika, uruchom to polecenie.

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

    Gdzie:

    • BUCKET_NAME_PATH – prawidłowy zasobnik Cloud Storage z opcjonalnym prefiksem ścieżki, w którym są przechowywane pliki eksportu.
    • PITR_TIMESTAMP – sygnatura czasowa PITR z dokładnością do minuty, np. 2023-05-26T10:20:00.00Z lub 2023-10-19T10:30:00.00-07:00.
    • COLLECTION_IDS – lista identyfikatorów kolekcji lub identyfikatorów grupy kolekcji, np. 'specific-collection-group1','specific-collection-group2'.
    • NAMESPACE_IDS – lista identyfikatorów przestrzeni nazw, np.'customer','orders'.

    Zanim wyeksportujesz dane odzyskiwania do określonego momentu, zwróć uwagę na te kwestie:

    • Określ sygnaturę czasową w formacie RFC 3339. Na przykład 2023-05-26T10:20:00.00Z lub 2023-10-19T10:30:00.00-07:00.
    • Upewnij się, że określona sygnatura czasowa jest sygnaturą czasową z dokładnością do minuty w ciągu ostatnich 7 dni, ale nie wcześniejszą niż earliestVersionTime. Jeśli dane nie istnieją już w określonej sygnaturze czasowej, zostanie wygenerowany błąd. Sygnatura czasowa musi być sygnaturą czasową z dokładnością do minuty, nawet jeśli określony czas przypada w ciągu ostatniej godziny.
    • Nie ponosisz opłat za nieudany eksport PITR.
  2. Zaimportuj do bazy danych.

    Aby zaimportować wyeksportowaną bazę danych, wykonaj czynności opisane w sekcji Importowanie wszystkich dokumentów. Jeśli w bazie danych istnieją już jakieś dokumenty, zostaną one zastąpione.