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 que tengan la facturación habilitada pueden usar la función de PITR. Google Cloud
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
: se ha definido como 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, anota 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 y 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 momento dado 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
de 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 de 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.
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 contenedor.
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 puede exportar 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.