Trabalhar com recuperação pontual (PITR, na sigla em inglês)

Nesta página, descrevemos como usar a recuperação pontual (PITR, na sigla em inglês) para reter e recuperar dados no Firestore no modo Datastore.

Para entender os conceitos da PITR, consulte Recuperação pontual.

Permissões

Para receber as permissões necessárias para gerenciar as configurações de PITR, peça ao administrador para conceder a você o papel do IAM de Proprietário do Cloud Datastore (roles/datastore.owner) no projeto com as configurações de PITR que você quer ativar. Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Esse papel predefinido contém as permissões necessárias para gerenciar as configurações de PITR. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As seguintes permissões são necessárias para gerenciar as configurações de PITR:

  • Para ativar a recuperação pontual (PITR, na sigla em inglês) ao criar um banco de dados: datastore.databases.create
  • Para atualizar as configurações de PITR no banco de dados: datastore.databases.update,datastore.databases.list
  • Para realizar leituras de dados PITR: datastore.databases.get,datastore.entities.get,datastore.entities.list,datastore.namespaces.get,datastore.namespaces.list,datastore.statistics.get,datastore.statistics.list
  • Para exportar dados PITR: datastore.databases.export
  • Para importar dados PITR: datastore.databases.import

Talvez você também consiga receber essas permissões com papéis personalizados ou outros papéis predefinidos.

Antes de começar

Observe os seguintes pontos antes de começar a usar a PITR:

  • Não é possível iniciar leituras de sete dias anteriores imediatamente depois de ativar a PITR.
  • Se você quiser ativar a PITR ao criar um banco de dados, use o comando gcloud firestore databases create. Não é possível ativar a PITR ao criar um banco de dados usando o console do Google Cloud.
  • O modo Datastore começa a reter versões a partir do ponto depois de ativar a PITR.
  • Não é possível ler dados PITR na janela PITR depois de desativar a PITR.
  • Se você reativar a PITR imediatamente após desativá-la, os dados da PITR anteriores não estarão mais disponíveis. Os dados da PITR criados antes da desativação serão excluídos após a data de validade.
  • Se você excluiu dados acidentalmente na última hora e a PITR está desativada, é possível restaurar seus dados ativando a PITR dentro de uma hora após a exclusão.
  • Qualquer leitura realizada em dados PITR expirados falha.

Ativar a PITR

Antes de usar a PITR, ative o faturamento do projeto do Google Cloud. Apenas projetos do Google Cloud com faturamento ativado podem usar o recurso PITR.

Para ativar a PITR no banco de dados:

Console

  1. No Console do Google Cloud, acesse a página Bancos de Dados.

    Acessar "Bancos de dados"

  2. Selecione o banco de dados necessário na lista de bancos de dados.

  3. No menu de navegação, clique em Recuperação de desastres.

  4. Clique em Editar para editar as configurações.

  5. Marque a caixa de seleção Ativar recuperação pontual e clique em Salvar.

A ativação da PITR incorre em custos de armazenamento. Para mais informações, consulte Preços.

Para desativar a recuperação pontual (PITR, na sigla em inglês), desmarque a caixa de seleção Ativar recuperação pontual na página "Recuperação de desastres" do console do Google Cloud.

gcloud

Ative a PITR durante a criação do banco de dados com o comando gcloud firestore databases create da seguinte maneira:

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

Substitua os valores da seguinte forma:

  • LOCATION: local em que você quer criar o banco de dados.
  • DATABASE_ID: definido como o ID do banco de dados ou (padrão).
  • TYPE: definido como datastore-mode.

É possível desativar a PITR usando o comando gcloud firestore databases update da seguinte maneira:

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

Substitua os valores da seguinte forma:

  • DATABASE_ID: definido como o ID do banco de dados ou (padrão).

Conseguir o período de armazenamento e o horário da versão mais antiga

Console

  1. No Console do Google Cloud, acesse a página Bancos de Dados.

    Acessar "Bancos de dados"

  2. Selecione o banco de dados necessário na lista de bancos de dados.

  3. No menu de navegação, clique em Recuperação de desastres.

  4. Na seção Configurações, anote o Período de retenção e o Horário da versão mais antiga.

    • Período de armazenamento: o período em que o modo Datastore retém todas as versões de dados do banco de dados. O valor é de uma hora quando a PITR está desativada e de sete dias quando a PITR está ativada.
    • Horário da versão mais antiga: o carimbo de data/hora mais antigo em que versões anteriores dos dados podem ser lidas na janela PITR. Esse valor é atualizado continuamente pelo modo Datastore e fica obsoleto no momento em que é consultado. Se você estiver usando esse valor para recuperar dados, não deixe de considerar o momento entre o momento em que o valor é consultado e o momento em que você inicia a recuperação.
    • Recuperação pontual: mostra Enabled se a PITR estiver ativada. Se a PITR estiver desativada, você verá Disabled.

gcloud

Execute o comando gcloud firestore database describe da seguinte maneira:

gcloud firestore databases describe --database=DATABASE_ID

Substitua DATABASE_ID pelo ID do banco de dados ou default.

Esta é a saída:

    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

Em que:

  • earliestVersionTime: carimbo de data/hora dos dados da PITR mais antigos armazenados.
  • pointInTimeRecoveryEnablement: mostra POINT_IN_TIME_RECOVERY_ENABLED, se a PITR estiver ativada. Se a PITR estiver desativada, você verá POINT_IN_TIME_RECOVERY_DISABLED ou o campo pointInTimeRecoveryEnablement pode não ser exibido.
  • versionRetentionPeriod: período em que os dados PITR são retidos em milissegundos. O valor pode ser uma hora quando a PITR estiver desativada ou sete dias se ela estiver ativada.

Ler dados PITR

Leia dados da PITR usando as bibliotecas de cliente, os métodos da API REST ou o conector do FirestoreIO Apache Beam.

Bibliotecas de cliente

Java

É necessário usar o método readTime na classe ReadOption para ler os dados da PITR. Não é possível usar a transação ReadOnly para realizar leituras. Consulte o exemplo de código ReadOption para mais informações.

  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 uma lista completa de exemplos de readTime, consulte o repositório do GitHub (em inglês).

Python

Use a leitura PITR no SDK do Python no modo Datastore com o método readTime ou a transação ReadOnly com readTime para realizar leituras.

  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 uma lista completa de exemplos de readTime, consulte o repositório GitHub.

API REST

As leituras PITR são compatíveis com os métodos de leitura do modo Datastore V1, que são lookup, runQuery e runAggregationQuery.

Para realizar uma leitura usando os métodos REST, tente uma das seguintes opções:

  1. Na solicitação do método de leitura, transmita o valor readTime como um carimbo de data/hora PITR compatível no método readOptions. Um carimbo de data/hora PITR pode ser um carimbo de data/hora com precisão de microssegundo na última hora ou um carimbo de data/hora de um minuto inteiro além da última hora, mas não anterior ao earliestVersionTime.

  2. Use o parâmetro readTime com o método BeginTransaction como parte de uma transação ReadOnly para várias leituras de PITR.

Apache Beam

Use o conector de E/S do Apache Beam do modo Datastore para ler ou gravar entidades em um banco de dados no modo Datastore em grande escala com o Dataflow.

Especifique o método withReadTime(Instant readTime) no objeto DatastoreV1.Read. Todas as leituras subsequentes que usam o objeto DatastoreV1.Read são lidas no mesmo readTime.

Java

O código a seguir mostra como usar o método withReadTime para leituras 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 uma lista completa de exemplos de withReadTime, consulte o repositório GitHub.

Exportar e importar dados da PITR

É possível exportar seu banco de dados para o Cloud Storage de dados PITR consistentes usando o comando gcloud firestore export. É possível exportar dados PITR em que o carimbo de data/hora é um minuto inteiro nos últimos sete dias, mas não anterior ao earliestVersionTime. Se os dados não existirem mais no carimbo de data/hora especificado, a operação de exportação falhará.

A operação de exportação da PITR oferece suporte a todos os filtros, incluindo a exportação de todas as entidades e a exportação de tipos ou namespaces específicos.

  1. Exporte o banco de dados, especificando o parâmetro snapshot-time para o carimbo de data/hora de recuperação necessário.

    gcloud

    Execute o comando a seguir para exportar o banco de dados para o bucket.

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

    Em que,

    • BUCKET_NAME_PATH: um bucket válido do Cloud Storage com um prefixo de caminho opcional em que os arquivos de exportação são armazenados.
    • PITR_TIMESTAMP: um carimbo de data/hora da PITR na granularidade de minutos, por exemplo, 2023-05-26T10:20:00.00Z ou 2023-10-19T10:30:00.00-07:00.
    • COLLECTION_IDS: uma lista de IDs de coleções ou de grupos de coleções, por exemplo, 'specific collection group1','specific collection group2'.
    • NAMESPACE_IDS: uma lista de IDs de namespace, por exemplo-'customer','orders'.

    A exportação de um subconjunto específico de tipos e/ou namespaces com um filtro de entidade também é compatível.

    Observe os seguintes pontos antes de exportar dados PITR:

    • Especifique o carimbo de data/hora no formato RFC 3339. Por exemplo, 2023-05-26T10:20:00.00Z ou 2023-10-19T10:30:00.00-07:00.
    • Verifique se o carimbo de data/hora especificado é de um minuto inteiro nos últimos sete dias, mas não é anterior ao earliestVersionTime. Se os dados não existirem mais no carimbo de data/hora especificado, você receberá um erro. O carimbo de data/hora precisa ser um minuto inteiro, mesmo que o horário especificado seja anterior à hora anterior.
    • Você não vai receber cobranças por falhas na exportação da PITR.
  2. Importar para um banco de dados.

    Use as etapas em Importar todas as entidades para importar o banco de dados exportado. Se alguma entidade já existir no seu banco de dados, ela será substituída. A importação de um subconjunto específico de tipos e/ou namespaces com um filtro de entidade também é aceita.