En esta página se describe cómo usar la recuperación a un momento dado (PITR) para conservar y recuperar datos en Firestore en el modo Datastore.
Para entender los conceptos de PITR, consulta Recuperación a un momento dado.
Permisos
Para obtener los permisos que necesitas para gestionar la configuración de PITR, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Propietario de Cloud Datastore (roles/datastore.owner
) en el proyecto cuya configuración de PITR quieras habilitar.
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.
Este rol predefinido contiene los permisos necesarios para gestionar la configuración de PITR. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:
Permisos obligatorios
Para gestionar los ajustes de PITR, se necesitan los siguientes permisos:
-
Para habilitar PITR al crear una base de datos, sigue estos pasos:
datastore.databases.create
-
Para actualizar los ajustes de PITR en una base de datos:
datastore.databases.update
,datastore.databases.list
-
Para realizar lecturas de datos de PITR, haz lo siguiente:
datastore.databases.get
,datastore.entities.get
,datastore.entities.list
,datastore.namespaces.get
,datastore.namespaces.list
,datastore.statistics.get
,datastore.statistics.list
-
Para exportar datos de PITR, sigue estos pasos:
datastore.databases.export
-
Para importar datos de PITR, haz lo siguiente:
datastore.databases.import
También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.
Antes de empezar
Ten en cuenta los siguientes puntos antes de empezar a usar PITR:
- No puedes empezar a leer desde hace siete días inmediatamente después de habilitar PITR.
- Si quieres habilitar PITR al crear una base de datos, debes usar el comando
gcloud firestore databases create
. No se puede habilitar PITR al crear una base de datos con la Google Cloud consola. - El modo Datastore empieza a conservar versiones a partir del momento en que se habilita PITR.
- No puedes leer los datos de PITR en la ventana de PITR después de inhabilitar PITR.
- Si vuelves a habilitar PITR inmediatamente después de inhabilitarlo, los datos anteriores de PITR ya no estarán disponibles. Los datos de PITR creados antes de inhabilitar PITR se eliminarán después de la fecha de vencimiento de PITR.
- Si has eliminado datos por error en la última hora y PITR está inhabilitado, puedes restaurarlos habilitando PITR en el plazo de una hora desde la eliminación.
- Cualquier lectura realizada en datos de PITR caducados falla.
Habilitar PITR
Antes de usar PITR, habilita la facturación de tu Google Cloud proyecto. Solo los proyectos de Google Cloud con la facturación habilitada pueden usar la función de recuperación a un momento dado.
Para habilitar PITR en tu base de datos, sigue estos pasos:
Consola
En la Google Cloud consola, ve a la página Bases de datos.
Seleccione la base de datos que necesite de la lista de bases de datos.
En el menú de navegación, haga clic en Recuperación ante desastres.
Haz clic en Editar para modificar la configuración.
Selecciona la casilla Habilitar recuperación a un momento dado y, a continuación, haz clic en Guardar.
Si habilitas PITR, se te aplicarán costes de almacenamiento. Consulta la página de precios para obtener más información.
Para inhabilitar la recuperación a un momento dado, desmarca la casilla Habilitar recuperación a un momento dado de la página Recuperación ante desastres de la consola de Google Cloud .
gcloud
Habilita PITR durante la creación de la base de datos con el comando gcloud firestore databases create
de la siguiente manera:
gcloud firestore databases create\
--location=LOCATION\
[--database=DATABASE_ID; default="(default)"]\
[--type=TYPE; default="firestore-native"]\
--enable-pitr
Sustituye los valores de la siguiente manera:
LOCATION
: ubicación en la que quieres crear la base de datos.DATABASE_ID
: se asigna al ID de la base de datos o al valor predeterminado.TYPE
- set to datastore-mode.
Para inhabilitar PITR, usa el comando gcloud firestore databases update
de la siguiente manera:
gcloud firestore databases update\
[--database=DATABASE_ID; default="(default)"]\
--no-enable-pitr
Sustituye los valores de la siguiente manera:
DATABASE_ID
: se asigna al ID de la base de datos o al valor predeterminado.
Obtener el periodo de conservación y la hora de la versión más antigua
Consola
En la Google Cloud consola, ve a la página Bases de datos.
Seleccione la base de datos que necesite de la lista de bases de datos.
En el menú de navegación, haga clic en Recuperación ante desastres.
En la sección Configuración, anote el Periodo de conservación y la Hora de la versión más antigua.
- Periodo de conservación: periodo durante el cual el modo Datastore conserva todas las versiones de los datos de la base de datos. El valor es de una hora cuando la restauración a un momento dado está inhabilitada y de siete días cuando está habilitada.
- Hora de la versión más antigua: la marca de tiempo más antigua en la que se pueden leer versiones anteriores de los datos en la ventana de recuperación a un momento dado. El modo Datastore actualiza este valor continuamente, pero se queda obsoleto en el momento en que se consulta. Si utiliza este valor para recuperar datos, tenga en cuenta el tiempo transcurrido desde el momento en que se consulta el valor hasta el momento en que inicia la recuperación.
- Recuperación a un momento dado: muestra
Enabled
si la recuperación a un momento dado está habilitada. Si la restauración a un punto en el tiempo está inhabilitada, verásDisabled
.
gcloud
Ejecuta el comando gcloud firestore databases describe de la siguiente manera:
gcloud firestore databases describe --database=DATABASE_ID
Sustituye DATABASE_ID
por el ID de la base de datos o default
.
Este es el resultado:
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
donde
earliestVersionTime
: marca de tiempo de los datos de PITR más antiguos almacenados.pointInTimeRecoveryEnablement
: muestraPOINT_IN_TIME_RECOVERY_ENABLED
si PITR está habilitado. Si la restauración a un momento dado está inhabilitada, verásPOINT_IN_TIME_RECOVERY_DISABLED
o puede que no se muestre el campopointInTimeRecoveryEnablement
.versionRetentionPeriod
: periodo durante el que se conservan los datos de PITR en milisegundos. El valor puede ser de una hora si la recuperación a un punto en el tiempo está inhabilitada o de siete días si está habilitada.
Leer datos de PITR
Puedes leer datos de PITR con las bibliotecas de cliente, los métodos de la API REST o el conector FirestoreIO de Apache Beam.
Bibliotecas de cliente
Java
Debe usar el método readTime
en la clase ReadOption
para leer los datos de PITR. No puedes usar la transacción ReadOnly
para realizar lecturas.
Para obtener más información, consulta el código de ejemplo de ReadOption.
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");
Para ver una lista completa de ejemplos de readTime
, consulta el repositorio de GitHub.
Python
Usa la lectura PITR en el SDK de Python del modo Datastore con el método readTime
o usa la transacción ReadOnly
con readTime
para realizar lecturas.
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()
Para ver una lista completa de ejemplos de readTime
, consulta el repositorio de GitHub.
API REST
Las lecturas de PITR se admiten en los métodos de lectura de la versión 1 del modo Datastore, que son lookup, runQuery y runAggregationQuery.
Para realizar una lectura con los métodos REST, prueba una de las siguientes opciones:
En la solicitud del método de lectura, envía el valor
readTime
como una marca de tiempo de PITR admitida en el métodoreadOptions
. Una marca de tiempo de PITR puede ser una marca de tiempo con precisión de microsegundos de la última hora o una marca de tiempo de minutos completos de hace más de una hora, pero no anterior a lasearliestVersionTime
.Usa el parámetro
readTime
junto con el métodoBeginTransaction
como parte de una transacciónReadOnly
para realizar varias lecturas de PITR.
Apache Beam
Usa el conector de E/ de Apache Beam en el modo Datastore para leer o escribir entidades en una base de datos en el modo Datastore a gran escala con Dataflow.
Especifica el método withReadTime(Instant readTime)
en el objeto DatastoreV1.Read
. Todas las lecturas posteriores que utilicen el objeto DatastoreV1.Read
se harán desde el mismo readTime
.
Java
En el siguiente código se muestra cómo usar el método withReadTime
para lecturas de 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);
...
Para ver una lista completa de ejemplos de withReadTime
, consulta el repositorio de GitHub.
Clonar desde una base de datos
Puedes clonar una base de datos en una marca de tiempo seleccionada en una base de datos nueva:
La base de datos clonada es una base de datos nueva que se creará en la misma ubicación que la base de datos de origen.
Para crear un clon, Firestore usa los datos de recuperación a un momento dado (PITR) de la base de datos de origen. La base de datos clonada incluye todos los datos e índices.
De forma predeterminada, la base de datos clonada se cifrará de la misma forma que la base de datos de origen, con el cifrado predeterminado de Google o con el cifrado CMEK. Puedes especificar otro tipo de cifrado o usar otra clave para el cifrado con CMEK.
La marca de tiempo tiene una granularidad de un minuto y especifica un momento del pasado, en el periodo definido por la ventana de PITR:
- Si PITR está habilitado en tu base de datos, puedes seleccionar cualquier minuto de los últimos 7 días (o menos si PITR se habilitó hace menos de 7 días).
- Si PITR no está habilitada, puedes seleccionar cualquier minuto de la última hora.
- Puedes consultar la marca de tiempo más antigua que puedes elegir en la descripción de tu base de datos.
Consola
En la Google Cloud consola, ve a la página Bases de datos.
En la fila de la tabla de la base de datos que quieras clonar, haz clic en
Ver más. Haz clic en Clonar. Aparecerá el cuadro de diálogo Crear un clon.En el cuadro de diálogo Crear un clon, proporciona los parámetros para clonar la base de datos:
En el campo Proporciona un ID al clon, introduce un ID de base de datos para la nueva base de datos clonada. Este ID de base de datos no debe estar asociado a ninguna base de datos.
En el campo Clonar desde, selecciona un momento para clonar. La hora seleccionada corresponde a una marca de tiempo de PITR con una granularidad de un minuto.
Haz clic en Crear clon.
gcloud
Usa el comando
gcloud alpha firestore databases clone
para clonar una base de datos:
gcloud alpha firestore databases clone \
--source-database='SOURCE_DATABASE' \
--snapshot-time='PITR_TIMESTAMP' \
--destination-database='DESTINATION_DATABASE_ID'
Haz los cambios siguientes:
SOURCE_DATABASE: el nombre de la base de datos que quieres clonar. El nombre tiene el formato
projects/PROJECT_ID/databases/SOURCE_DATABASE_ID
.PITR_TIMESTAMP: a Marca de tiempo de PITR en el formato RFC 3339, con una granularidad de minutos. Por ejemplo,
2025-06-01T10:20:00.00Z
o2025-06-01T10:30:00.00-07:00
.DESTINATION_DATABASE_ID: un ID de base de datos de una nueva base de datos clonada. Este ID de base de datos no debe estar asociado a ninguna base de datos.
Ejemplo:
gcloud alpha firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='projects/example-project/databases/example-dest-db'
Cambiar la configuración de cifrado de la base de datos clonada
De forma predeterminada, la base de datos clonada tendrá la misma configuración de cifrado que la base de datos de origen. Para cambiar la configuración del cifrado, usa el argumento --encryption-type
:
- (Valor predeterminado)
use-source-encryption
: usa la misma configuración de cifrado que la base de datos de origen. google-default-encryption
: usa el cifrado predeterminado de Google.customer-managed-encryption
: usa el cifrado CMEK. Especifica un ID de clave en el argumento--kms-key-name
.
En el siguiente ejemplo se muestra cómo configurar el cifrado con CMEK para la base de datos clonada:
gcloud alpha firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='projects/example-project/databases/example-dest-db' \
--encryption-type='customer-managed-encryption' \
--kms-key-name='projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key'
Exportar e importar datos de PITR
Puedes exportar tu base de datos a Cloud Storage a partir de datos de PITR con el comando gcloud firestore export
. Puede exportar datos de PITR cuya marca de tiempo sea una marca de tiempo de un minuto completo de los últimos siete días, pero no anterior al earliestVersionTime
. Si los datos ya no existen en la marca de tiempo especificada, la operación de exportación fallará.
La operación de exportación de PITR admite todos los filtros, incluida la exportación de todas las entidades y la exportación de tipos o espacios de nombres específicos.
Exporta la base de datos y especifica el parámetro
snapshot-time
con la marca de tiempo de recuperación necesaria.gcloud
Ejecuta el siguiente comando para exportar la base de datos a tu bucket.
gcloud firestore export gs://[BUCKET_NAME_PATH] \ --snapshot-time=[PITR_TIMESTAMP] \ --collection-ids=[COLLECTION_IDS] \ --namespace-ids=[NAMESPACE_IDS]
Dónde,
BUCKET_NAME_PATH
: un segmento de Cloud Storage válido con un prefijo de ruta opcional en el que se almacenan los archivos de exportación.PITR_TIMESTAMP
: una marca de tiempo de PITR con una granularidad de minutos, por ejemplo,2023-05-26T10:20:00.00Z
o2023-10-19T10:30:00.00-07:00
.COLLECTION_IDS
- una lista de IDs de colección o de grupo de colecciones, por ejemplo-'specific collection group1'
,'specific collection group2'
.NAMESPACE_IDS
: una lista de IDs de espacio de nombres, por ejemplo,'customer'
,'orders'
.
También se admite la exportación de un subconjunto específico de tipos o espacios de nombres con un filtro de entidades.
Ten en cuenta los siguientes puntos antes de exportar datos de PITR:
- Especifica la marca de tiempo en formato RFC 3339.
Por ejemplo,
2023-05-26T10:20:00.00Z
o2023-10-19T10:30:00.00-07:00
. - Asegúrate de que la marca de tiempo que especifiques sea una marca de tiempo de un minuto completo de los últimos siete días, pero no anterior a
earliestVersionTime
. Si los datos ya no existen en la marca de tiempo especificada, se mostrará un error. La marca de tiempo debe ser un minuto completo, aunque la hora especificada sea de la última hora. - No se te cobrará por una exportación de PITR fallida.
Importar a una base de datos.
Sigue los pasos que se indican en Importar todas las entidades para importar la base de datos que has exportado. Si ya existe alguna entidad en tu base de datos, se sobrescribirá. También se admite la importación de un subconjunto específico de tipos o espacios de nombres con un filtro de entidades.