Работа с восстановлением на момент времени (PITR)

Актуально для Cloud Firestore Standard Edition и Cloud Firestore Enterprise Edition.

На этой странице описано, как использовать восстановление на определенный момент времени (PITR) для сохранения и восстановления данных в Cloud Firestore с поддержкой MongoDB.

Чтобы понять концепцию восстановления на определенный момент времени (PITR), см. раздел «Восстановление на определенный момент времени» .

Разрешения

Чтобы получить необходимые разрешения для управления настройками PITR, попросите администратора предоставить вам следующие роли IAM в проекте, где вы хотите включить PITR:

  • Владелец облачного хранилища данных ( roles/datastore.owner )

Для пользовательских ролей убедитесь, что предоставлены следующие разрешения:

  • Чтобы включить PITR при создании базы данных: datastore.databases.create
  • Для обновления настроек PITR в существующей базе данных: datastore.databases.update , datastore.databases.list
  • Для чтения данных из PITR: datastore.databases.get , datastore.entities.get , datastore.entities.list
  • Для экспорта данных PITR: datastore.databases.export
  • Для импорта данных PITR: datastore.databases.import
  • Для клонирования базы данных: datastore.databases.clone

Прежде чем начать

Перед началом использования PITR обратите внимание на следующие моменты:

  • После включения функции PITR вы не сможете начать чтение с семидневной давности сразу после включения этой функции.
  • Чтобы включить PITR при создании базы данных, необходимо использовать команду gcloud firestore databases create . Включение PITR при создании базы данных с помощью консоли Google Cloud не поддерживается.
  • После включения функции PITR (Post-Install Retirement — сохранение версий) Cloud Firestore с совместимостью с MongoDB начинает сохранять версии с момента их создания.
  • После отключения функции PITR вы не сможете считывать данные PITR в окне PITR.
  • Если вы повторно включите PITR сразу после его отключения, предыдущие данные PITR станут недоступны. Все данные PITR, созданные до отключения PITR, будут удалены после истечения срока действия PITR.
  • Если вы случайно удалили данные за последний час, и функция PITR отключена, вы можете восстановить данные, включив PITR в течение часа после удаления.
  • Любая операция чтения данных PITR с истекшим сроком действия завершается неудачей.

Включить PITR

Перед использованием PITR включите выставление счетов для вашего проекта Google Cloud . Функциональность PITR доступна только для проектов Google Cloud с включенным выставлением счетов.

Чтобы включить PITR для вашей базы данных:

Консоль

  1. В консоли Google Cloud перейдите на страницу «Базы данных» .

    Перейти к базам данных

  2. Выберите необходимую базу данных из списка баз данных.

  3. В навигационном меню нажмите «Аварийное восстановление» .

  4. Нажмите «Редактировать» , чтобы изменить настройки.

  5. Установите флажок «Включить восстановление на определенный момент времени» , а затем нажмите «Сохранить» .

Включение PITR влечет за собой расходы на хранение. Дополнительную информацию см. в разделе «Цены» .

Чтобы отключить восстановление на определенный момент времени (PITR), снимите флажок « Включить восстановление на определенный момент времени» на странице «Аварийное восстановление» в консоли Google Cloud.

gcloud

Включите PITR при создании базы данных с помощью команды gcloud firestore databases create и параметра --enable-ptir следующим образом:

gcloud firestore databases create\
  --location=LOCATION\
  --database=DATABASE_ID\
  --type=firestore-native\
  --enable-pitr

Замените значения следующим образом:

  • LOCATION - место, где вы хотите создать свою базу данных.
  • DATABASE_ID - задайте идентификатор базы данных.

Отключить PITR можно с помощью команды gcloud firestore databases update следующим образом:

gcloud firestore databases update\
  --database=DATABASE_ID\
  --no-enable-pitr

Замените значения следующим образом:

  • DATABASE_ID - задайте идентификатор базы данных (по умолчанию).

Получите период хранения и время выхода самой ранней версии.

Консоль

  1. В консоли Google Cloud перейдите на страницу «Базы данных» .

    Перейти к базам данных

  2. Выберите необходимую базу данных из списка баз данных.

  3. В навигационном меню нажмите «Аварийное восстановление» .

  4. В разделе «Настройки» обратите внимание на период хранения и время выхода самой ранней версии .

    • Период хранения : период, в течение которого Cloud Firestore с поддержкой MongoDB сохраняет все версии данных для базы данных. Значение составляет один час, когда функция PITR отключена, и семь дней, когда она включена.
    • Время самой ранней версии : самая ранняя метка времени, когда более старые версии данных можно прочитать в окне PITR. Это значение постоянно обновляется Cloud Firestore с совместимостью с MongoDB и устаревает в момент запроса. Если вы используете это значение для восстановления данных, обязательно учитывайте время от момента запроса значения до момента начала восстановления.
    • Восстановление на определенный момент времени : отображается Enabled , если PITR включено. Если PITR отключено, отображается Disabled .

gcloud

Выполните команду `gcloud firestore databases describe` следующим образом:

gcloud firestore databases describe --database=DATABASE_ID

Замените DATABASE_ID на идентификатор базы данных или '(default)' .

Вот результат:

    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

где,

  • earliestVersionTime : метка времени самых ранних сохраненных данных PITR.
  • pointInTimeRecoveryEnablement : отображает POINT_IN_TIME_RECOVERY_ENABLED , если PITR включен. Если PITR отключен, вы либо увидите POINT_IN_TIME_RECOVERY_DISABLED , либо поле pointInTimeRecoveryEnablement может не отображаться.
  • versionRetentionPeriod : период времени в миллисекундах, в течение которого данные PITR сохраняются. Значение может составлять один час, если PITR отключен, или семь дней, если PITR включен.

Прочитайте данные PITR

Вы можете считывать данные PITR, используя клиентские библиотеки, методы REST API или коннектор FirestoreIO Apache Beam.

Клиентские библиотеки

Java

Для чтения данных PITR необходимо использовать транзакцию ReadOnly . В операциях чтения нельзя напрямую указывать readTime . Дополнительную информацию см. в разделе «Транзакции и пакетная запись» .

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

Узел

Для чтения данных PITR необходимо использовать транзакцию ReadOnly ). В операциях чтения нельзя напрямую указывать readTime . Дополнительную информацию см. в разделе «Транзакции и пакетная запись» .

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)}
);

REST API

Чтение PITR поддерживается всеми методами чтения Cloud Firestore с совместимостью с MongoDB, а именно: get , list , batchGet , listCollectionIds , listDocuments , runQuery , runAggregationQuery и partitionQuery .

Для выполнения операции чтения с использованием методов REST попробуйте один из следующих вариантов:

  1. В запросе метода чтения передайте значение readTime в качестве поддерживаемой метки времени PITR в методе readOptions . Метка времени PITR может быть либо меткой времени с точностью до микросекунды в течение последнего часа, либо меткой времени с точностью до целой минуты после последнего часа, но не раньше, чем earliestVersionTime .

  2. Используйте параметр readTime вместе с методом BeginTransaction в рамках транзакции ReadOnly transaction) для множественных операций чтения PITR.

Apache Beam

Используйте коннектор Apache Beam от Cloud Firestore с совместимостью с MongoDB для чтения и записи документов в базу данных Cloud Firestore с совместимостью с MongoDB в больших масштабах с помощью Dataflow.

В следующих методах чтения коннектора Cloud Firestore с MongoDB compatibilityIO поддерживаются операции чтения PITR. Эти методы чтения поддерживают метод withReadTime(@Nullable Instant readTime) , который можно использовать для чтения PITR:

Java

Следующий код можно использовать с примером кода конвейера Dataflow для операций пакетного чтения или записи. В примере используется метод withReadTime(@Nullable Instant readTime) для чтения с мгновенной загрузкой (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())
  ...

Полный список примеров readTime в конвейере Dataflow можно найти в репозитории GitHub .

Клон из базы данных

Вы можете клонировать существующую базу данных в выбранный момент времени в новую базу данных:

  • Клонированная база данных — это новая база данных, которая будет создана в том же месте, что и исходная база данных.

    Для создания клона Cloud Firestore использует данные восстановления на определенный момент времени (PITR) исходной базы данных. Клонированная база данных включает все данные и индексы.

  • По умолчанию клонированная база данных будет зашифрована так же, как и исходная база данных, с использованием либо стандартного шифрования Google, либо шифрования CMEK . Вы можете указать другой тип шифрования или использовать другой ключ для шифрования CMEK.

  • Временная метка имеет точность до одной минуты и указывает на определенный момент времени в прошлом, в периоде, заданном окном PITR :

    • Если для вашей базы данных включена функция PITR, выберите любую минуту за последние 7 дней (или меньше, если функция PITR была включена менее 7 дней назад).
    • Если функция PITR не включена, вы можете выбрать любую минуту за последний час.
    • Вы можете проверить самую раннюю доступную метку времени в описании вашей базы данных .

Консоль

Консоль Firebase не поддерживает клонирование баз данных. Для клонирования баз данных можно использовать инструкции Google Cloud CLI .

gcloud

Для клонирования базы данных используйте команду ` gcloud firestore databases clone :

gcloud firestore databases clone \
--source-database='SOURCE_DATABASE' \
--snapshot-time='PITR_TIMESTAMP' \
--destination-database='DESTINATION_DATABASE_ID'

Замените следующее:

  • SOURCE_DATABASE : имя существующей базы данных, которую вы хотите клонировать. Имя имеет формат projects/ PROJECT_ID /databases/ SOURCE_DATABASE_ID .

  • PITR_TIMESTAMP : метка времени PITR в формате RFC 3339 с точностью до минуты. Например: 2025-06-01T10:20:00.00Z или 2025-06-01T10:30:00.00-07:00 .

  • DESTINATION_DATABASE_ID : идентификатор базы данных для новой клонированной базы данных. Этот идентификатор базы данных не должен быть связан с существующей базой данных.

Пример:

gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db'

Если вы хотите привязаться к определенным тегам при клонировании базы данных, используйте предыдущую команду с флагом --tags , который представляет собой необязательный список пар тегов KEY=VALUE для привязки.

Пример:

gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db' \
--tags=key1=value1,key2=value2

По умолчанию клонированная база данных будет иметь ту же конфигурацию шифрования, что и исходная база данных. Чтобы изменить конфигурацию шифрования, используйте аргумент --encryption-type :

  • (По умолчанию) use-source-encryption : использовать ту же конфигурацию шифрования, что и для исходной базы данных.
  • google-default-encryption : использовать шифрование по умолчанию от Google.
  • customer-managed-encryption : использовать шифрование CMEK. Укажите идентификатор ключа в аргументе --kms-key-name .

В следующем примере показано, как настроить шифрование CMEK для клонированной базы данных:

gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db' \
--encryption-type='customer-managed-encryption' \
--kms-key-name='projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key'

Firebase CLI

Для клонирования базы данных используйте команду firebase firestore:databases:clone :

firebase firestore:databases:clone \
'SOURCE_DATABASE' \
'DESTINATION_DATABASE' \
--snapshot-time 'PITR_TIMESTAMP'

Замените следующее:

  • SOURCE_DATABASE : имя существующей базы данных, которую вы хотите клонировать. Имя имеет формат projects/ PROJECT_ID /databases/ SOURCE_DATABASE_ID .

  • DESTINATION_DATABASE : имя базы данных для новой клонированной базы данных. Имя имеет формат projects/ PROJECT_ID /databases/ DESTINATION_DATABASE_ID . Это имя базы данных не должно быть связано с существующей базой данных.

  • PITR_TIMESTAMP : метка времени PITR в формате RFC 3339 с точностью до минуты. Например: 2025-06-01T10:20:00.00Z или 2025-06-01T10:30:00.00-07:00 . Если не указано иное, выбранное значение будет текущим временем, округленным до минуты.

По умолчанию клонированная база данных будет иметь ту же конфигурацию шифрования, что и исходная база данных. Чтобы изменить конфигурацию шифрования, используйте аргумент --encryption-type :

  • (По умолчанию) USE_SOURCE_ENCRYPTION : использовать ту же конфигурацию шифрования, что и в исходной базе данных.
  • GOOGLE_DEFAULT_ENCRYPTION : использовать шифрование по умолчанию от Google.
  • CUSTOMER_MANAGED_ENCRYPTION : использовать шифрование CMEK. Укажите идентификатор ключа в аргументе --kms-key-name .

В следующем примере показано, как настроить шифрование CMEK для клонированной базы данных:

firebase firestore:databases:clone \
'projects/example-project/databases/(default)' \
'projects/example-project/databases/example-dest-db' \
--snapshot-time 'PITR_TIMESTAMP' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION

Ограничения

Операция клонирования не клонирует данные поиска App Engine или сущности BLOB-объектов из базы данных (default) . Эти данные действительны только для базы данных (default) и не будут полезны при клонировании из базы данных (default) в базу данных, которая не поддерживает такие данные, поэтому они исключаются из клонирования.

Экспорт и импорт данных из PITR

Вы можете экспортировать свою базу данных в Cloud Storage из данных PITR с помощью команды gcloud firestore export . Вы можете экспортировать данные PITR, где временная метка представляет собой целую минуту за последние семь дней, но не раньше, чем earliestVersionTime . Если данные больше не существуют на указанную временную метку, операция экспорта завершится неудачей.

Операция экспорта PITR поддерживает все фильтры, включая экспорт всех документов и экспорт отдельных коллекций.

  1. Экспортируйте базу данных, указав параметр snapshot-time равным выбранной метке времени восстановления.

    gcloud

    Выполните следующую команду, чтобы экспортировать базу данных в ваш сегмент.

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

    Где,

    • BUCKET_NAME_PATH — допустимый сегмент Cloud Storage с необязательным префиксом пути, где хранятся файлы экспорта.
    • PITR_TIMESTAMP — метка времени PITR с точностью до минуты, например, 2023-05-26T10:20:00.00Z или 2023-10-19T10:30:00.00-07:00 .
    • COLLECTION_IDS — список идентификаторов коллекций или групп коллекций, например 'specific-collection-group1','specific-collection-group2' .
    • NAMESPACE_IDS — список идентификаторов пространств имен, например, 'customer','orders' .

    Перед экспортом данных PITR обратите внимание на следующие моменты:

    • Укажите метку времени в формате RFC 3339. Например, 2023-05-26T10:20:00.00Z или 2023-10-19T10:30:00.00-07:00 .
    • Убедитесь, что указанная вами метка времени представляет собой целую минуту за последние семь дней, но не раньше, чем earliestVersionTime . Если данные на указанную метку времени больше не существуют, будет сгенерирована ошибка. Метка времени должна быть целой минутой, даже если указанное время находится в пределах последнего часа.
    • За неудачный экспорт PITR с вас не взимается плата.
  2. Импорт в базу данных.

    Для импорта экспортированной базы данных выполните действия, описанные в разделе «Импорт всех документов» . Если какой-либо документ уже существует в вашей базе данных, он будет перезаписан.