Trabajar con la recuperación a un momento dado (PITR)

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

  1. En la Google Cloud consola, ve a la página Bases de datos.

    Ir a Bases de datos

  2. Seleccione la base de datos que necesite de la lista de bases de datos.

  3. En el menú de navegación, haga clic en Recuperación ante desastres.

  4. Haz clic en Editar para modificar la configuración.

  5. 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

  1. En la Google Cloud consola, ve a la página Bases de datos.

    Ir a Bases de datos

  2. Seleccione la base de datos que necesite de la lista de bases de datos.

  3. En el menú de navegación, haga clic en Recuperación ante desastres.

  4. 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ás Disabled.

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: muestra POINT_IN_TIME_RECOVERY_ENABLED si PITR está habilitado. Si la restauración a un momento dado está inhabilitada, verás POINT_IN_TIME_RECOVERY_DISABLED o puede que no se muestre el campo pointInTimeRecoveryEnablement.
  • 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:

  1. En la solicitud del método de lectura, envía el valor readTime como una marca de tiempo de PITR admitida en el método readOptions. 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 las earliestVersionTime.

  2. Usa el parámetro readTime junto con el método BeginTransaction como parte de una transacción ReadOnly 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.

  1. 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 o 2023-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 o 2023-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.
  2. 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.