Utilizzare il recupero point-in-time (PITR)

Questa pagina descrive come utilizzare il recupero point-in-time (PITR) per conservare e recuperare i dati in Firestore in modalità Datastore.

Per comprendere i concetti del PITR, consulta la sezione Recupero point-in-time.

Autorizzazioni

Per ottenere le autorizzazioni necessarie per gestire le impostazioni PITR, chiedi all'amministratore di concederti il ruolo IAM Proprietario Cloud Datastore (roles/datastore.owner) per il progetto di cui vuoi abilitare le impostazioni PITR. Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.

Questo ruolo predefinito contiene le autorizzazioni necessarie per gestire le impostazioni PITR. Per visualizzare le autorizzazioni necessarie, espandi la sezione Autorizzazioni richieste:

Autorizzazioni obbligatorie

Per gestire le impostazioni PITR sono necessarie le seguenti autorizzazioni:

  • Per abilitare PITR durante la creazione di un database: datastore.databases.create
  • Per aggiornare le impostazioni PITR sul database esistente: datastore.databases.update,datastore.databases.list
  • Per eseguire le letture dai dati PITR: datastore.databases.get,datastore.entities.get,datastore.entities.list,datastore.namespaces.get,datastore.namespaces.list,datastore.statistics.get,datastore.statistics.list
  • Per esportare i dati PITR: datastore.databases.export
  • Per importare i dati PITR: datastore.databases.import

Potresti anche essere in grado di ottenere queste autorizzazioni con i ruoli personalizzati o altri ruoli predefiniti.

Prima di iniziare

Prima di iniziare a utilizzare PITR, tieni presente quanto segue:

  • Non puoi iniziare a leggere da sette giorni nel passato subito dopo aver abilitato PITR.
  • Se vuoi abilitare il PITR quando crei un database, devi utilizzare il comando gcloud firestore databases create. L'abilitazione di PITR durante la creazione di un database utilizzando la console Google Cloud non è supportata.
  • La modalità Datastore inizia a conservare le versioni a partire dal momento in poi dopo l'abilitazione di PITR.
  • Una volta disattivato, non puoi leggere i dati PITR nella finestra PITR.
  • Se lo riattivi subito dopo averlo disattivato, i dati PITR precedenti non saranno più disponibili. Tutti i dati PITR creati prima di disabilitare PITR verranno eliminati dopo la data di scadenza del PITR.
  • Se hai eliminato accidentalmente dati nell'ultima ora e il PITR è disattivato, puoi ripristinarli attivando PITR entro un'ora dall'eliminazione.
  • Qualsiasi lettura eseguita su dati PITR scaduti non riesce.

Abilita PITR

Prima di utilizzare PITR, abilita la fatturazione per il tuo progetto Google Cloud. Solo i progetti Google Cloud con fatturazione abilitata possono utilizzare la funzionalità PITR.

Per abilitare PITR per il tuo database:

Console

  1. Nella console Google Cloud, vai alla pagina Database.

    Vai a Database

  2. Seleziona il database richiesto dall'elenco dei database.

  3. Nel menu di navigazione, fai clic su Ripristino di emergenza.

  4. Fai clic su Modifica per modificare le impostazioni.

  5. Seleziona la casella di controllo Abilita il recupero point-in-time, quindi fai clic su Salva.

L'abilitazione di PITR comporta costi di archiviazione. Consulta la sezione Prezzi per ulteriori informazioni.

Per disattivare il PITR, deseleziona la casella di controllo Abilita il ripristino point-in-time nella pagina Ripristino di emergenza nella console Google Cloud.

gcloud

Abilita PITR durante la creazione del database con il comando gcloud firestore databases create come segue:

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

Sostituisci i valori come segue:

  • LOCATION: posizione in cui vuoi creare il database.
  • DATABASE_ID: impostato sull'ID database o (valore predefinito).
  • TYPE: impostato sulla modalità datastore.

Puoi disabilitare il PITR utilizzando il comando gcloud firestore databases update come segue:

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

Sostituisci i valori come segue:

  • DATABASE_ID: impostato sull'ID database o (valore predefinito).

Recuperare il periodo di conservazione e l'ora della versione meno recente

Console

  1. Nella console Google Cloud, vai alla pagina Database.

    Vai a Database

  2. Seleziona il database richiesto dall'elenco dei database.

  3. Nel menu di navigazione, fai clic su Ripristino di emergenza.

  4. Nella sezione Impostazioni, prendi nota del Periodo di conservazione e della Data e ora della versione precedente.

    • Periodo di conservazione: il periodo in cui la modalità Datastore conserva tutte le versioni dei dati per il database. Il valore è un'ora quando PITR è disabilitato e sette giorni quando PITR è abilitato.
    • Data/ora versione precedente: il timestamp meno recente in cui le versioni precedenti dei dati possono essere lette nella finestra PITR. Questo valore viene aggiornato continuamente in modalità Datastore e diventa inattivo nel momento in cui viene eseguita la query. Se utilizzi questo valore per recuperare i dati, assicurati di tenere conto del tempo dal momento in cui viene eseguita la query sul valore a quello in cui avvii il recupero.
    • Recupero point-in-time: mostra Enabled, se il PITR è attivo. Se PITR è disattivato, verrà visualizzato Disabled.

gcloud

Esegui il comando gcloud firestore Publishers describe come segue:

gcloud firestore databases describe --database=DATABASE_ID

Sostituisci DATABASE_ID con l'ID database o default.

Ecco l'output:

    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

dove

  • earliestVersionTime: timestamp dei primi dati PITR archiviati.
  • pointInTimeRecoveryEnablement: mostra POINT_IN_TIME_RECOVERY_ENABLED, se PITR è abilitato. Se il PITR è disattivato, verrà visualizzato POINT_IN_TIME_RECOVERY_DISABLED oppure il campo pointInTimeRecoveryEnablement potrebbe non essere visualizzato.
  • versionRetentionPeriod: il periodo di tempo per il quale i dati PITR vengono conservati in millisecondi. Il valore può essere di un'ora se il PITR è disattivato o di sette giorni se il PITR è abilitato.

Lettura dati PITR

Puoi leggere i dati PITR utilizzando le librerie client, i metodi dell'API REST o il connettore Apache Beam FirestoreIO.

Librerie client

Java

Per leggere i dati PITR, devi utilizzare il metodo readTime nella classe ReadOption. Non puoi utilizzare la transazione ReadOnly per eseguire le letture. Per ulteriori informazioni, vedi ReadOption codice campione.

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

Per un elenco completo di esempi di readTime, consulta il repository GitHub.

Python

Utilizza la lettura PITR nell'SDK Python in modalità Datastore utilizzando il metodo readTime oppure utilizza la transazione ReadOnly con readTime per eseguire le letture.

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

Per un elenco completo di esempi di readTime, consulta il repository GitHub.

API REST

Le letture PITR sono supportate nei metodi di lettura V1 in modalità Datastore, che sono lookup, runQuery ed runAggregationQuery.

Per eseguire una lettura utilizzando i metodi REST, prova una delle seguenti opzioni:

  1. Nella richiesta del metodo di lettura, passa il valore readTime come timestamp PITR supportato nel metodo readOptions. Un timestamp PITR può essere un timestamp di precisione di microsecondi nell'ultima ora o un timestamp di un minuto intero oltre l'ultima ora, ma non precedente al earliestVersionTime.

  2. Utilizza il parametro readTime insieme al metodo BeginTransaction come parte di una transazione ReadOnly per più letture PITR.

Apache Beam

Utilizza il connettore Apache Beam IO in modalità Datastore per leggere o scrivere entità in un database in modalità Datastore su larga scala con Dataflow.

Specifica il metodo withReadTime(Instant readTime) nell'oggetto DatastoreV1.Read. Tutte le letture successive utilizzando l'oggetto DatastoreV1.Read letto dallo stesso readTime.

Java

Il codice seguente mostra come utilizzare il metodo withReadTime per le letture PITR.

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

Per un elenco completo di esempi di withReadTime, consulta il repository GitHub.

Esportazione e importazione dai dati PITR

Puoi esportare il database in Cloud Storage dai dati PITR utilizzando il comando gcloud firestore export. Puoi esportare i dati PITR in cui il timestamp è un timestamp di minuti interi negli ultimi sette giorni, ma non precedente a earliestVersionTime. Se i dati non esistono più al timestamp specificato, l'operazione di esportazione non va a buon fine.

L'operazione di esportazione PITR supporta tutti i filtri, inclusa l'esportazione di tutte le entità e l'esportazione di tipi o spazi dei nomi specifici.

  1. Esporta il database, specificando il parametro snapshot-time nel timestamp di recupero richiesto.

    gcloud

    Esegui questo comando per esportare il database nel bucket.

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

    Dove,

    • BUCKET_NAME_PATH: un bucket Cloud Storage valido con un prefisso di percorso facoltativo in cui sono archiviati i file di esportazione.
    • PITR_TIMESTAMP: un timestamp PITR alla granularità dei minuti, ad esempio 2023-05-26T10:20:00.00Z o 2023-10-19T10:30:00.00-07:00.
    • COLLECTION_IDS: un elenco di ID raccolta o ID gruppo di raccolte, ad esempio 'specific collection group1' e 'specific collection group2'.
    • NAMESPACE_IDS: un elenco di ID spazio dei nomi, ad esempio-'customer','orders'.

    È anche supportata l'esportazione di un sottoinsieme specifico di tipi e/o spazi dei nomi con un filtro di entità.

    Prima di esportare i dati PITR, tieni presente quanto segue:

    • Specifica il timestamp nel formato RFC 3339. Ad esempio, 2023-05-26T10:20:00.00Z o 2023-10-19T10:30:00.00-07:00.
    • Assicurati che il timestamp specificato sia un timestamp di un minuto intero relativo agli ultimi sette giorni, ma non precedente a earliestVersionTime. Se i dati non esistono più al timestamp specificato, verrà visualizzato un errore. Il timestamp deve essere un minuto intero, anche se l'ora specificata rientra nell'ultima ora.
    • Non ti verrà addebitato alcun costo per un'esportazione PITR non riuscita.
  2. Importa in un database.

    Segui i passaggi descritti in Importare tutte le entità per importare il database esportato. Se un'entità è già presente nel database, verrà sovrascritta. È anche supportata l'importazione di un sottoinsieme specifico di tipi e/o spazi dei nomi con un filtro di entità.