Trabajar con la recuperación de un momento determinado (PITR)

En esta página, se describe cómo usar la recuperación de un momento determinado (PITR) para retener y recuperar datos en Firestore.

Para comprender los conceptos de la PITR, consulta Recuperación de un momento determinado.

Permisos

Para obtener los permisos que necesitas para administrar la configuración de la PITR, pídele a tu administrador que te otorgue el rol de IAM de Propietario de Cloud Datastore (roles/datastore.owner) en el proyecto cuya configuración de PITR deseas habilitar. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para administrar la configuración de PITR. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para administrar la configuración de PITR:

  • Para habilitar la PITR cuando creas una base de datos, sigue estos pasos: datastore.databases.create
  • Para actualizar la configuración de la PITR en una base de datos existente, sigue estos pasos: datastore.databases.update,datastore.databases.list
  • Para realizar operaciones de lectura desde datos de la PITR, sigue estos pasos: datastore.databases.get,datastore.entities.get,datastore.entities.list
  • Para exportar datos de PITR, sigue estos pasos: datastore.databases.export
  • Para importar datos de la PITR, sigue estos pasos: datastore.databases.import

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Antes de comenzar

Ten en cuenta los siguientes puntos antes de comenzar a usar la PITR:

  • No puedes comenzar a leer desde siete días en el pasado inmediatamente después de habilitar la PITR.
  • Si quieres habilitar la PITR cuando creas una base de datos, debes usar el comando gcloud firestore databases create. No se admite la habilitación de la PITR mientras se crea una base de datos con la consola de Google Cloud.
  • Firestore comienza a retener versiones a partir de un momento después de habilitar la PITR.
  • No puedes leer los datos de la PITR en la ventana de la PITR después de inhabilitarla.
  • Si vuelves a habilitar la PITR inmediatamente después de inhabilitarla, los datos de la PITR anteriores ya no estarán disponibles. Cualquier dato de la PITR creado antes de inhabilitar la PITR se borrará después de la fecha de vencimiento de la PITR.
  • Si borraste datos de forma accidental en la última hora y la PITR está inhabilitada, puedes habilitar la PITR dentro de la hora posterior a la eliminación para restablecer los datos.
  • Cualquier lectura realizada en datos de PITR vencidos falla.

Habilita la PITR

Antes de usar la PITR, habilita la facturación para tu proyecto de Google Cloud. Solo los proyectos de Google Cloud que tengan la facturación habilitada pueden usar la funcionalidad de la PITR.

Sigue estos pasos para habilitar la PITR en tu base de datos:

Console

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

    Ir a Bases de datos

  2. Selecciona la base de datos requerida de la lista.

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

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

  5. Selecciona la casilla de verificación Habilitar la recuperación de un momento determinado y, luego, haz clic en Guardar.

Habilitar la PITR genera costos de almacenamiento. Consulta Precios para obtener más información.

Para inhabilitar la PITR, desmarca la casilla de verificación Habilitar la recuperación de un momento determinado de la página Recuperación ante desastres en la consola de Google Cloud.

gcloud

Habilita la 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

Reemplaza los valores de la siguiente manera:

  • LOCATION: La ubicación en la que quieres crear tu base de datos.
  • DATABASE_ID: Se establece en el ID de la base de datos o en “(predeterminado)”.
  • TYPE: Se establece en firestore-native.

Puedes inhabilitar la PITR con el comando gcloud firestore databases update de la siguiente manera:

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

Reemplaza los valores de la siguiente manera:

  • DATABASE_ID: Se establece en el ID de la base de datos o en “(predeterminado)”.

Obtén el período de retención y la fecha de la versión más antigua

Console

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

    Ir a Bases de datos

  2. Selecciona la base de datos requerida de la lista.

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

  4. En la sección Configuración, observa el Período de retención y la Fecha de la versión más antigua.

    • Período de retención: Es el período en el que Firestore retiene todas las versiones de los datos de la base de datos. El valor es una hora cuando la PITR está inhabilitada y siete días cuando está habilitada.
    • Fecha de la versión más antigua: Es la primera marca de tiempo en la que se pueden leer las versiones anteriores de los datos en la ventana de PITR. Firestore actualiza este valor de forma continua y se vuelve inactivo en el momento en que se consulta. Si usas este valor para recuperar datos, asegúrate de tener en cuenta el tiempo desde el momento en que se consulta el valor hasta el momento en que inicias la recuperación.
    • Recuperación de un momento determinado: Muestra Enabled si la PITR está habilitada. Si la PITR está inhabilitada, verás Disabled.

gcloud

Ejecuta el comando gcloud firestore databases describe de la siguiente manera:

gcloud firestore databases describe --database=DATABASE_ID

Reemplaza DATABASE_ID por el ID de la base de datos o '(default)'.

Esta es la salida:

    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

En este ejemplo:

  • earliestVersionTime: La marca de tiempo de los primeros datos de PITR almacenados.
  • pointInTimeRecoveryEnablement: Muestra POINT_IN_TIME_RECOVERY_ENABLED si la PITR está habilitada. Si la PITR está inhabilitada, verás POINT_IN_TIME_RECOVERY_DISABLED o es posible que no se muestre el campo pointInTimeRecoveryEnablement.
  • versionRetentionPeriod: Período en milisegundos para el que se retienen los datos de la PITR. El valor puede ser de una hora cuando la PITR está inhabilitada o de siete días si la PITR está habilitada.

Lee datos de la PITR

Puedes leer datos de la PITR con las bibliotecas cliente, los métodos de la API de REST o el conector de Apache Beam de FirestoreIO.

Bibliotecas cliente

Java

Debes usar la transacción ReadOnly para leer los datos de la PITR. No puedes especificar directamente readTime en lecturas. Consulta Transacciones y escrituras en lotes para obtener más información.

  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

Debes usar una transacción ReadOnly para leer los datos de la PITR. No puedes especificar directamente readTime en lecturas. Consulta Transacciones y escrituras en lotes para obtener más información.

  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 de REST

Las lecturas de la PITR son compatibles con todos los métodos de lectura de Firestore, que son get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery y partitionQuery.

Para realizar una lectura con los métodos de REST, prueba una de las siguientes opciones:

  1. En la solicitud del método de lectura, pasa el valor readTime como una marca de tiempo de la PITR compatible en el método readOptions. Una marca de tiempo de la PITR puede ser una marca de tiempo de precisión de microsegundos dentro de la última hora o una marca de tiempo de un minuto entero más allá de la última hora, pero no antes de la earliestVersionTime.

  2. Usa el parámetro readTime junto con el método BeginTransaction como parte de una transacción ReadOnly para varias lecturas de PITR.

Apache Beam

Usa el conector FirestoreIO de Apache Beam para leer o escribir documentos en una base de datos de Firestore a gran escala con Dataflow.

Las lecturas de PITR son compatibles con el siguiente método de lectura del conector de FirestoreIO. Estos métodos de lectura admiten el método withReadTime(@Nullable Instant readTime) que puedes usar para las lecturas de la PITR:

Java

El siguiente código se puede usar con el código de canalización de Dataflow de ejemplo para operaciones de lectura o escritura masivas. En el ejemplo, se usa el método withReadTime(@Nullable Instant readTime) para lecturas de la 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())
  ...

Para obtener una lista completa de los ejemplos de readTime en la canalización de Dataflow, consulta el repositorio de GitHub.

Importa y exporta datos de PITR

Puedes exportar tu base de datos a Cloud Storage desde datos de PITR coherentes con el comando gcloud firestore export. Puedes exportar datos de PITR en los que la marca de tiempo sea una de un minuto completo dentro de los últimos siete días, pero no antes que la earliestVersionTime. Si los datos ya no existen en la marca de tiempo especificada, fallará la operación de exportación.

La operación de exportación de la PITR admite todos los filtros, incluida la exportación de todos los documentos y la exportación de colecciones específicas.

  1. Exporta la base de datos y especifica el parámetro snapshot-time en la marca de tiempo de recuperación deseada.

    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
    

    En donde,

    • BUCKET_NAME_PATH: Un bucket de Cloud Storage válido con un prefijo de ruta de acceso opcional en el que se almacenan los archivos de exportación.
    • PITR_TIMESTAMP: Es una marca de tiempo de la PITR en el nivel de detalle por minuto, por ejemplo, 2023-05-26T10:20:00.00Z o 2023-10-19T10:30:00.00-07:00.
    • COLLECTION_IDS: Una lista de los IDs de colección o de grupos de colecciones, por ejemplo, 'specific-collection-group1','specific-collection-group2'.
    • NAMESPACE_IDS: Una lista de IDs de espacio de nombres, por ejemplo, 'customer','orders'.

    Ten en cuenta los siguientes puntos antes de exportar los datos de la 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 de un minuto completo en los últimos siete días, pero no antes de la earliestVersionTime. Si los datos ya no existen en la marca de tiempo especificada, se generará un error. La marca de tiempo debe ser un minuto entero, incluso si la hora especificada corresponde a la última hora.
    • No se te cobra por una exportación de la PITR con errores.
  2. Importa a una base de datos

    Sigue los pasos que se indican en Importa todos los documentos para importar la base de datos exportada. Si ya existe un documento en tu base de datos, se reemplazará.