Questa pagina descrive come utilizzare il recupero point-in-time (PITR) per conservare e recuperare i dati in Cloud Firestore.
Per comprendere i concetti relativi al PITR, consulta Recupero point-in-time.
Autorizzazioni
Per ottenere le autorizzazioni necessarie per gestire le impostazioni PITR, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto in cui vuoi attivare il PITR:
- Cloud Datastore Owner (
roles/datastore.owner)
Per i ruoli personalizzati, assicurati che siano concesse le seguenti autorizzazioni:
- Per abilitare il 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 letture dai dati PITR:
datastore.databases.get,datastore.entities.get,datastore.entities.list - Per esportare i dati PITR:
datastore.databases.export - Per importare i dati PITR:
datastore.databases.import - Per clonare un database:
datastore.databases.clone
Prima di iniziare
Tieni presente quanto segue prima di iniziare a utilizzare il PITR:
- Non puoi iniziare a leggere da sette giorni prima del momento attuale immediatamente dopo aver attivato il PITR.
- Se vuoi attivare il PITR quando crei un database, devi utilizzare il comando
gcloud firestore databases create. L'attivazione del PITR durante la creazione di un database utilizzando la console Google Cloud non è supportata. - Cloud Firestore inizia a conservare le versioni dal momento in cui viene abilitato il PITR.
- Non puoi leggere i dati PITR nella finestra PITR dopo aver disattivato il PITR.
- Se riattivi il PITR subito dopo averlo disattivato, i dati PITR precedenti non saranno più disponibili. Tutti i dati PITR creati prima della disattivazione del PITR verranno eliminati dopo la data di scadenza del PITR.
- Se hai eliminato accidentalmente dei dati nell'ultima ora e il PITR è disattivato, puoi ripristinarli attivando il PITR entro un'ora dall'eliminazione.
- Qualsiasi lettura eseguita su dati PITR scaduti non va a buon fine.
Abilita PITR
Prima di utilizzare il PITR, attiva la fatturazione per il tuo progetto Google Cloud. Solo i progetti Google Cloud con fatturazione abilitata possono utilizzare la funzionalità PITR.
Per abilitare il PITR per il tuo database:
Console
Nella console Google Cloud, vai alla pagina Database.
Seleziona il database richiesto dall'elenco dei database.
Nel menu di navigazione, fai clic su Disaster recovery.
Fai clic su Modifica per modificare le impostazioni.
Seleziona la casella di controllo Abilita il recupero point-in-time, quindi fai clic su Salva.
L'abilitazione del PITR comporta costi di archiviazione. Per saperne di più, consulta la sezione Prezzi.
Per disabilitare il PITR, deseleziona la casella di controllo Abilita il recupero point-in-time nella pagina Disaster recovery della console Google Cloud.
gcloud
Attiva il PITR durante la creazione del database con gcloud firestore databases create e il comando --enable-ptir come segue:
gcloud firestore databases create\
--location=LOCATION\
--database=DATABASE_ID\
--type=firestore-native\
--enable-pitr
Sostituisci i valori come segue:
LOCATION: la località in cui vuoi creare il database.DATABASE_ID: impostato su un ID database.
Puoi disattivare il PITR utilizzando il comando gcloud firestore databases update come segue:
gcloud firestore databases update\
--database=DATABASE_ID\
--no-enable-pitr
Sostituisci i valori come segue:
DATABASE_ID: impostato sull'ID database o su (default).
Recupera il periodo di conservazione e la data e l'ora della prima versione
Console
Nella console Google Cloud, vai alla pagina Database.
Seleziona il database richiesto dall'elenco dei database.
Nel menu di navigazione, fai clic su Disaster recovery.
Nella sezione Impostazioni, prendi nota del Periodo di conservazione e dell'Ora della versione meno recente.
- Periodo di conservazione: il periodo in cui Cloud Firestore conserva tutte le versioni dei dati per il database. Il valore è un'ora quando il PITR è disabilitato e sette giorni quando il PITR è abilitato.
- Ora versione più vecchia: il timestamp più vecchio in cui è possibile leggere le versioni precedenti dei dati nella finestra PITR. Questo valore viene aggiornato continuamente da Cloud Firestore 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 che intercorre tra il momento in cui viene eseguita la query sul valore e il momento in cui avvii il recupero.
- Recupero point-in-time: mostra
Enabledse il PITR è abilitato. Se il PITR è disattivato, vedraiDisabled.
gcloud
Esegui il comando gcloud firestore databases describe come segue:
gcloud firestore databases describe --database=DATABASE_ID
Sostituisci DATABASE_ID con l'ID del 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/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
dove
earliestVersionTime: timestamp dei dati PITR più vecchi archiviati.pointInTimeRecoveryEnablement: mostraPOINT_IN_TIME_RECOVERY_ENABLEDse il PITR è abilitato. Se il PITR è disattivato, vedraiPOINT_IN_TIME_RECOVERY_DISABLEDo il campopointInTimeRecoveryEnablementpotrebbe non essere visualizzato.versionRetentionPeriod: periodo di tempo per il quale i dati PITR vengono conservati in millisecondi. Il valore può essere un'ora se il PITR è disabilitato o sette giorni se il PITR è abilitato.
Leggi i 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
Devi utilizzare la transazione ReadOnly per leggere i dati PITR. Non puoi specificare direttamente readTime nelle letture.
Per saperne di più, consulta Transazioni e scritture in batch.
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();
Nodo
Devi utilizzare una transazione ReadOnly per leggere i dati PITR. Non puoi specificare direttamente readTime nelle letture.
Per saperne di più, consulta Transazioni e scritture in batch.
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)}
);
API REST
Le letture PITR sono supportate in tutti i metodi di lettura Cloud Firestore, ovvero get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery e partitionQuery.
Per eseguire una lettura utilizzando i metodi REST, prova una delle seguenti opzioni:
Nella richiesta del metodo di lettura, passa il valore
readTimecome timestamp PITR supportato nel metodoreadOptions. Un timestamp PITR può essere un timestamp con precisione al microsecondo nell'ultima ora o un timestamp di un minuto intero oltre l'ultima ora, ma non prima diearliestVersionTime.Utilizza il parametro
readTimeinsieme al metodoBeginTransactionnell'ambito di una transazioneReadOnlyper più letture PITR.
Apache Beam
Utilizza il connettore Apache Beam di I/O Cloud Firestore per leggere o scrivere documenti in un database Cloud Firestore su larga scala con Dataflow.
Le letture PITR sono supportate nel seguente metodo di lettura del connettore Cloud FirestoreIO. Questi metodi di lettura supportano il metodo withReadTime(@Nullable Instant readTime) che puoi utilizzare per le letture PITR:
- FirestoreV1.BatchGetDocuments
- FirestoreV1.ListCollectionIds
- FirestoreV1.ListDocuments
- FirestoreV1.PartitionQuery
Java
Il codice seguente può essere utilizzato con il codice della pipeline Dataflow di esempio per operazioni di lettura o scrittura collettive. L'esempio utilizza il metodo withReadTime(@Nullable Instant readTime) per le letture 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())
...
Per un elenco completo degli esempi di readTime nella pipeline Dataflow, consulta il repository GitHub.
Clona da un database
Puoi clonare un database esistente in un timestamp selezionato in un nuovo database:
Il database clonato è un nuovo database che verrà creato nella stessa località del database di origine.
Per creare un clone, Cloud Firestore utilizza i dati di recupero point-in-time (PITR) del database di origine. Il database clonato include tutti i dati e gli indici.
Per impostazione predefinita, il database clonato verrà criptato nello stesso modo del database di origine, utilizzando la crittografia predefinita di Google o la crittografia CMEK. Puoi specificare un tipo di crittografia diverso o utilizzare una chiave diversa per la crittografia CMEK.
Il timestamp ha una granularità di un minuto e specifica un momento nel passato, nel periodo definito dalla finestra PITR:
- Se il PITR è abilitato per il tuo database, seleziona un minuto qualsiasi degli ultimi 7 giorni (o meno se il PITR è stato abilitato meno di 7 giorni fa).
- Se il PITR non è abilitato, puoi selezionare un minuto qualsiasi nell'ultima ora.
- Puoi controllare il timestamp più recente che puoi scegliere nella descrizione del database.
Console
La console Firebase non supporta la clonazione dei database. Puoi utilizzare le istruzioni per Google Cloud CLI per clonare i database.
gcloud
Utilizza il comando gcloud firestore databases clone per clonare un database:
gcloud firestore databases clone \
--source-database='SOURCE_DATABASE' \
--snapshot-time='PITR_TIMESTAMP' \
--destination-database='DESTINATION_DATABASE_ID'
Sostituisci quanto segue:
SOURCE_DATABASE: il nome di un database esistente che vuoi clonare. Il nome utilizza il formato
projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.PITR_TIMESTAMP: un timestamp PITR nel formato RFC 3339, con granularità al minuto. Ad esempio:
2025-06-01T10:20:00.00Zo2025-06-01T10:30:00.00-07:00.DESTINATION_DATABASE_ID: un ID database per un nuovo database clonato. Questo ID database non deve essere associato a un database esistente.
Esempio:
gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db'
Se vuoi eseguire l'associazione ad alcuni tag durante la clonazione di un database, utilizza il comando precedente con il flag --tags, che è un elenco facoltativo di coppie CHIAVE=VALORE di tag da associare.
Esempio:
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
Per impostazione predefinita, il database clonato avrà la stessa configurazione di crittografia del database di origine. Per modificare la configurazione della crittografia, utilizza l'argomento --encryption-type:
- (Predefinito)
use-source-encryption: utilizza la stessa configurazione di crittografia del database di origine. google-default-encryption: utilizza la crittografia predefinita di Google.customer-managed-encryption: utilizza la crittografia CMEK. Specifica un ID chiave nell'argomento--kms-key-name.
L'esempio seguente mostra come configurare la crittografia CMEK per il database clonato:
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'
Interfaccia a riga di comando di Firebase
Utilizza il comando firebase firestore:databases:clone per clonare un database:
firebase firestore:databases:clone \
'SOURCE_DATABASE' \
'DESTINATION_DATABASE' \
--snapshot-time 'PITR_TIMESTAMP'
Sostituisci quanto segue:
SOURCE_DATABASE: il nome di un database esistente che vuoi clonare. Il nome utilizza il formato
projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.DESTINATION_DATABASE: un nome per un nuovo database clonato. Il nome utilizza il formato
projects/PROJECT_ID/databases/DESTINATION_DATABASE_ID. Questo nome di database non deve essere associato a un database esistente.PITR_TIMESTAMP: un timestamp PITR nel formato RFC 3339, con granularità al minuto. Ad esempio:
2025-06-01T10:20:00.00Zo2025-06-01T10:30:00.00-07:00. Se non specificato, lo snapshot scelto sarà l'ora corrente, arrotondata per difetto al minuto.
Per impostazione predefinita, il database clonato avrà la stessa configurazione di crittografia del database di origine. Per modificare la configurazione della crittografia, utilizza l'argomento --encryption-type:
- (Predefinito)
USE_SOURCE_ENCRYPTION: utilizza la stessa configurazione di crittografia del database di origine. GOOGLE_DEFAULT_ENCRYPTION: utilizza la crittografia predefinita di Google.CUSTOMER_MANAGED_ENCRYPTION: utilizza la crittografia CMEK. Specifica un ID chiave nell'argomento--kms-key-name.
L'esempio seguente mostra come configurare la crittografia CMEK per il database clonato:
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
Limitazioni
Un'operazione di clonazione non clona i dati di ricerca di App Engine o le entità blob da un database (default). Questi dati sono validi solo per il database (default) e non saranno utili se esegui la clonazione da (default) a un database che non supporta questi dati, pertanto sono esclusi dai cloni.
Esporta e importa 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 un minuto intero compreso negli ultimi sette giorni, ma non prima del giorno earliestVersionTime. Se i dati non esistono più nel timestamp specificato, l'operazione di esportazione non va a buon fine.
L'operazione di esportazione PITR supporta tutti i filtri, inclusa l'esportazione di tutti i documenti e l'esportazione di raccolte specifiche.
Esporta il database, specificando il parametro
snapshot-timeper il timestamp di recupero scelto.gcloud
Esegui questo comando per esportare il database nel tuo bucket.
gcloud firestore export gs://BUCKET_NAME_PATH \ --snapshot-time=PITR_TIMESTAMP \ --collection-ids=COLLECTION_IDS \ --namespace-ids=NAMESPACE_IDSDove:
BUCKET_NAME_PATH: un bucket Cloud Storage valido con un prefisso del percorso facoltativo in cui sono archiviati i file di esportazione.PITR_TIMESTAMP: un timestamp PITR con granularità al minuto, ad esempio2023-05-26T10:20:00.00Zo2023-10-19T10:30:00.00-07:00.COLLECTION_IDS: un elenco di ID raccolta o ID gruppo di raccolte, ad esempio'specific-collection-group1','specific-collection-group2'.NAMESPACE_IDS: un elenco di ID spazio dei nomi, ad esempio'customer','orders'.
Tieni presente quanto segue prima di esportare i dati PITR:
- Specifica il timestamp nel formato RFC 3339.
Ad esempio:
2023-05-26T10:20:00.00Zo2023-10-19T10:30:00.00-07:00. - Assicurati che il timestamp specificato sia un timestamp di un minuto intero
negli ultimi sette giorni, ma non prima del
earliestVersionTime. Se i dati non esistono più nel timestamp specificato, viene generato un errore. Il timestamp deve essere un minuto intero, anche se l'ora specificata rientra nell'ora precedente. - Non ti verrà addebitato alcun costo per un'esportazione PITR non riuscita.
Importa in un database.
Segui i passaggi descritti in Importa tutti i documenti per importare il database esportato. Se un documento esiste già nel database, verrà sovrascritto.