Utiliser la récupération à un moment précis

Cette page explique comment utiliser la récupération à un moment précis pour conserver et récupérer des données dans Firestore en mode Datastore.

Pour comprendre les concepts de la récupération à un moment précis, consultez la page Récupération à un moment précis.

Autorisations

Pour obtenir les autorisations nécessaires pour gérer les paramètres de récupération à un moment précis, demandez à votre administrateur de vous attribuer le rôle IAM Propriétaire Cloud Datastore (roles/datastore.owner) pour le projet dont vous souhaitez activer les paramètres de récupération à un moment précis. Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Ce rôle prédéfini contient les autorisations requises pour gérer les paramètres de récupération à un moment précis. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

Les autorisations suivantes sont requises pour gérer les paramètres de récupération à un moment précis:

  • Pour activer la récupération à un moment précis lors de la création d'une base de données : datastore.databases.create
  • Pour mettre à jour les paramètres PITR dans une base de données existante : datastore.databases.update,datastore.databases.list
  • Pour effectuer des lectures à partir de données PITR : datastore.databases.get,datastore.entities.get,datastore.entities.list,datastore.namespaces.get,datastore.namespaces.list,datastore.statistics.get,datastore.statistics.list
  • Pour exporter des données PITR : datastore.databases.export
  • Pour importer des données PITR : datastore.databases.import

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Avant de commencer

Notez les points suivants avant de commencer à utiliser la récupération à un moment précis:

  • Vous ne pouvez pas commencer la lecture des sept derniers jours immédiatement après avoir activé la récupération à un moment précis.
  • Si vous souhaitez activer la récupération à un moment précis lorsque vous créez une base de données, vous devez utiliser la commande gcloud firestore databases create. Il n'est pas possible d'activer la récupération à un moment précis lors de la création d'une base de données à l'aide de la console Google Cloud.
  • Le mode Datastore commence à conserver les versions à partir du moment où la récupération à un moment précis est activée.
  • Vous ne pouvez pas lire les données PITR dans la fenêtre PITR après avoir désactivé la récupération à un moment précis.
  • Si vous réactivez la récupération à un moment précis après l'avoir désactivée, les données de la récupération à un moment précis ne sont plus disponibles. Toutes les données PITR créées avant la désactivation de la récupération à un moment précis seront supprimées après sa date d'expiration.
  • Si vous avez accidentellement supprimé des données au cours de la dernière heure et que la récupération à un moment précis est désactivée, vous pouvez les restaurer en activant la récupération à un moment précis dans l'heure qui suit leur suppression.
  • Toute lecture effectuée sur des données PITR expirées échouera.

Activer la récupération à un moment précis

Avant d'utiliser la récupération à un moment précis, activez la facturation pour votre projet Google Cloud. Seuls les projets Google Cloud pour lesquels la facturation est activée peuvent utiliser la fonctionnalité de récupération à un moment précis.

Pour activer la récupération à un moment précis pour votre base de données:

Console

  1. Dans la console Google Cloud, accédez à la page Base de données.

    Accéder à la page "Bases de données"

  2. Sélectionnez la base de données requise dans la liste des bases de données.

  3. Dans le menu de navigation, cliquez sur Reprise après sinistre.

  4. Cliquez sur Modifier pour changer les paramètres.

  5. Cochez la case Activer la récupération à un moment précis, puis cliquez sur Enregistrer.

L'activation de la récupération à un moment précis engendre des coûts de stockage. Reportez-vous à la page Tarifs pour plus de détails.

Pour désactiver la récupération à un moment précis, décochez la case Activer la récupération à un moment précis sur la page "Récupération après sinistre" de la console Google Cloud.

gcloud

Activez la récupération à un moment précis lors de la création de la base de données à l'aide de la commande gcloud firestore databases create, comme suit:

gcloud firestore databases create\
  --location=LOCATION\
  [--database=DATABASE_ID; default="(default)"]\
  [--type=TYPE; default="firestore-native"]\
  --enable-pitr

Remplacez les valeurs comme suit :

  • LOCATION : emplacement où vous souhaitez créer votre base de données.
  • DATABASE_ID : défini sur l'ID de la base de données ou sur la valeur par défaut.
  • TYPE : défini sur datastore-mode.

Vous pouvez désactiver la récupération à un moment précis à l'aide de la commande gcloud firestore databases update comme suit:

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

Remplacez les valeurs comme suit :

  • DATABASE_ID : défini sur l'ID de la base de données ou sur la valeur par défaut.

Obtenir la durée de conservation et l'heure de la version la plus ancienne

Console

  1. Dans la console Google Cloud, accédez à la page Base de données.

    Accéder à la page "Bases de données"

  2. Sélectionnez la base de données requise dans la liste des bases de données.

  3. Dans le menu de navigation, cliquez sur Reprise après sinistre.

  4. Dans la section Paramètres, notez la durée de conservation et la date et heure de la version la plus ancienne.

    • Durée de conservation: période pendant laquelle le mode Datastore conserve toutes les versions des données de la base de données. La valeur est d'une heure lorsque la récupération à un moment précis est désactivée et de sept jours lorsque la récupération à un moment précis est activée.
    • Date et heure de la version la plus proche: l'horodatage le plus ancien auquel les versions antérieures des données peuvent être lues dans la fenêtre PITR. Cette valeur est mise à jour en continu par le mode Datastore et devient obsolète dès qu'elle est interrogée. Si vous utilisez cette valeur pour récupérer des données, veillez à tenir compte du temps écoulé entre le moment où la valeur est interrogée et le moment où vous lancez la récupération.
    • Récupération à un moment précis: affiche Enabled si la récupération à un moment précis est activée. Si la récupération à un moment précis est désactivée, Disabled s'affiche.

gcloud

Exécutez la commande gcloud Firestore database describe comme suit:

gcloud firestore databases describe --database=DATABASE_ID

Remplacez DATABASE_ID par l'ID de la base de données ou default.

Voici le résultat :

    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

où :

  • earliestVersionTime : horodatage des données PITR les plus anciennes stockées.
  • pointInTimeRecoveryEnablement: affiche POINT_IN_TIME_RECOVERY_ENABLED si la récupération à un moment précis est activée. Si la récupération à un moment précis est désactivée, POINT_IN_TIME_RECOVERY_DISABLED s'affiche, ou le champ pointInTimeRecoveryEnablement peut ne pas s'afficher.
  • versionRetentionPeriod : période pendant laquelle les données de la récupération à un moment précis sont conservées en millisecondes. La valeur peut être d'une heure lorsque la récupération à un moment précis est désactivée ou de sept jours si elle est activée.

Lire les données PITR

Vous pouvez lire des données PITR à l'aide des bibliothèques clientes, des méthodes de l'API REST ou du connecteur Apache Beam FirestoreIO.

Bibliothèques clientes

Java

Vous devez utiliser la méthode readTime dans la classe ReadOption pour lire les données PITR. Vous ne pouvez pas utiliser la transaction ReadOnly pour effectuer des lectures. Pour en savoir plus, consultez l'exemple de code 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");

Pour obtenir la liste complète des exemples readTime, consultez le dépôt GitHub.

Python

Utilisez la lecture PITR dans le SDK Python en mode Datastore à l'aide de la méthode readTime ou utilisez la transaction ReadOnly avec readTime pour effectuer des lectures.

  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()

Pour obtenir la liste complète des exemples readTime, consultez le dépôt GitHub.

API REST

Les lectures PITR sont compatibles avec les méthodes de lecture du mode Datastore V1, à savoir lookup, runQuery et runAggregationQuery.

Pour effectuer une lecture à l'aide des méthodes REST, essayez l'une des options suivantes:

  1. Dans la requête de méthode de lecture, transmettez la valeur readTime en tant qu'horodatage PITR compatible dans la méthode readOptions. Un horodatage PITR peut être soit un horodatage de précision de la microseconde dans la dernière heure, soit un code temporel d'une minute entière au-delà de la dernière heure, mais pas avant la earliestVersionTime.

  2. Utilisez le paramètre readTime avec la méthode BeginTransaction dans le cadre d'une transaction ReadOnly pour plusieurs lectures PITR.

Apache Beam

Utilisez le connecteur Apache Beam d'E/S en mode Datastore pour lire ou écrire des entités dans une base de données en mode Datastore à grande échelle avec Dataflow.

Spécifiez la méthode withReadTime(Instant readTime) sur l'objet DatastoreV1.Read. Toutes les lectures suivantes à l'aide de l'objet DatastoreV1.Read sont lues à partir du même readTime.

Java

Le code suivant montre comment utiliser la méthode withReadTime pour les lectures 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);
    ...

Pour obtenir la liste complète des exemples withReadTime, consultez le dépôt GitHub.

Exporter et importer à partir de données PITR

Vous pouvez exporter votre base de données vers Cloud Storage à partir de données PITR à l'aide de la commande gcloud firestore export. Vous pouvez exporter des données PITR dont le code temporel correspond à une minute entière au cours des sept derniers jours, mais pas avant le earliestVersionTime. Si les données n'existent plus au code temporel spécifié, l'opération d'exportation échoue.

L'opération d'exportation PITR est compatible avec tous les filtres, y compris l'exportation de toutes les entités et l'exportation de genres ou d'espaces de noms spécifiques.

  1. Exportez la base de données en spécifiant le paramètre snapshot-time sur le code temporel de récupération requis.

    gcloud

    Exécutez la commande suivante pour exporter la base de données vers votre bucket.

    gcloud firestore export gs://[BUCKET_NAME_PATH] \
        --snapshot-time=[PITR_TIMESTAMP] \
        --collection-ids=[COLLECTION_IDS] \
        --namespace-ids=[NAMESPACE_IDS]
    

    Où :

    • BUCKET_NAME_PATH : bucket Cloud Storage valide avec un préfixe de chemin d'accès facultatif, où les fichiers d'exportation sont stockés.
    • PITR_TIMESTAMP : code temporel PITR à la minute près, par exemple 2023-05-26T10:20:00.00Z ou 2023-10-19T10:30:00.00-07:00.
    • COLLECTION_IDS : liste d'ID ou d'ID de groupe de collections (par exemple, 'specific collection group1' ou 'specific collection group2').
    • NAMESPACE_IDS : liste d'ID d'espaces de noms, par exemple 'customer' ou 'orders'.

    Il est également possible d'exporter un sous-ensemble spécifique de genres et/ou d'espaces de noms avec un filtre d'entité.

    Notez les points suivants avant d'exporter des données PITR:

    • Spécifiez l'horodatage au format RFC 3339. Par exemple, 2023-05-26T10:20:00.00Z ou 2023-10-19T10:30:00.00-07:00.
    • Assurez-vous que le code temporel que vous spécifiez correspond à une minute complète comprise dans les sept derniers jours, qui ne doit pas être antérieure à earliestVersionTime. Si les données n'existent plus à l'horodatage spécifié, vous obtenez une erreur. Le code temporel doit être d'une minute entière, même si l'heure spécifiée se situe dans l'heure qui précède.
    • Si l'exportation PITR échoue, aucuns frais ne vous seront facturés.
  2. Importer dans une base de données

    Suivez la procédure décrite dans Importer toutes les entités pour importer votre base de données exportée. Si une entité existe déjà dans votre base de données, elle sera écrasée. Il est également possible d'importer un sous-ensemble spécifique de genres et/ou d'espaces de noms avec un filtre d'entité.