На этой странице описывается, как использовать восстановление на определенный момент времени (PITR) для сохранения и восстановления данных в Cloud Firestore .
Чтобы понять концепции 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
Прежде чем начать
Прежде чем начать использовать PITR, обратите внимание на следующие моменты:
- Вы не сможете начать чтение данных за последние семь дней сразу после включения PITR.
- Если вы хотите включить PITR при создании базы данных, вы должны использовать команду
gcloud firestore databases create
. Включение PITR при создании базы данных с помощью консоли Google Cloud не поддерживается. - Cloud Firestore начинает сохранять версии с момента включения PITR.
- После отключения PITR вы не сможете прочитать данные PITR в окне PITR.
- Если вы снова включите PITR сразу после его отключения, прошлые данные PITR больше не будут доступны. Любые данные PITR, созданные до отключения PITR, будут удалены после истечения срока действия PITR.
- Если вы случайно удалили данные в течение последнего часа и PITR отключен, вы можете восстановить свои данные, включив PITR в течение одного часа после удаления.
- Любое чтение устаревших данных PITR завершается неудачей.
Включить ПИТР
Перед использованием PITR включите биллинг для вашего проекта Google Cloud . Только проекты Google Cloud с включенным биллингом могут использовать функциональность PITR.
Чтобы включить PITR для вашей базы данных:
Консоль
В консоли Google Cloud перейдите на страницу Базы данных .
Выберите необходимую базу данных из списка баз данных.
В меню навигации нажмите «Аварийное восстановление» .
Нажмите «Изменить» , чтобы изменить настройки.
Установите флажок Включить восстановление на определенный момент времени , а затем нажмите Сохранить .
Включение PITR повлечет за собой расходы на хранение. См. раздел Цены для получения дополнительной информации.
Чтобы отключить PITR, снимите флажок Включить восстановление на определенный момент времени на странице «Аварийное восстановление» в консоли Google Cloud.
gcloud
Включите PITR во время создания базы данных с помощью команды gcloud firestore databases create
следующим образом:
gcloud firestore databases create\
--location=LOCATION\
[--database=DATABASE_ID; default="(default)"]\
[--type=TYPE; default="firestore-native"]\
--enable-pitr
Замените значения следующим образом:
-
LOCATION
- место, где вы хотите создать свою базу данных. -
DATABASE_ID
— задается идентификатор базы данных или (по умолчанию). -
TYPE
- установите значение firestore-native.
Вы можете отключить PITR с помощью команды gcloud firestore databases update
следующим образом:
gcloud firestore databases update\
[--database=DATABASE_ID; default="(default)"]\
--no-enable-pitr
Замените значения следующим образом:
-
DATABASE_ID
— задается идентификатор базы данных или (по умолчанию).
Получите период хранения и время самой ранней версии
Консоль
В консоли Google Cloud перейдите на страницу Базы данных .
Выберите необходимую базу данных из списка баз данных.
В меню навигации нажмите «Аварийное восстановление» .
В разделе «Настройки» обратите внимание на период хранения и время самой ранней версии .
- Период хранения : период, в течение которого Cloud Firestore сохраняет все версии данных для базы данных. Значение составляет один час, когда PITR отключен, и семь дней, когда PITR включен.
- Самое раннее время версии : самая ранняя временная метка, при которой более старые версии данных могут быть прочитаны в окне PITR. Это значение постоянно обновляется Cloud Firestore и становится устаревшим в момент запроса. Если вы используете это значение для восстановления данных, обязательно учитывайте время с момента запроса значения до момента начала восстановления.
- Восстановление на момент времени : отображается
Enabled
, если PITR включен. Если PITR отключен, вы увидитеDisabled
.
gcloud
Запустите команду описания баз данных gcloud firestore следующим образом:
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.
Клиентские библиотеки
Ява
Для чтения данных 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 , а именно get , list , batchGet , listCollectionIds , listDocuments , runQuery , runAggregationQuery и partitionQuery .
Чтобы выполнить чтение с использованием методов REST, попробуйте один из следующих вариантов:
В запросе метода чтения передайте значение
readTime
как поддерживаемую временную метку PITR в методеreadOptions
. Временная метка PITR может быть либо временной меткой с точностью до микросекунды в течение последнего часа, либо временной меткой с точностью до целой минуты за пределами последнего часа, но не ранее, чемearliestVersionTime
.Используйте параметр
readTime
вместе с методомBeginTransaction
как часть транзакцииReadOnly
для множественных чтений PITR.
Apache Луч
Используйте коннектор Cloud Firestore IO Apache Beam для чтения и записи документов в базе данных Cloud Firestore в больших масштабах с помощью Dataflow.
Чтения PITR поддерживаются в следующем методе чтения соединителя Cloud Firestore IO. Эти методы чтения поддерживают метод withReadTime(@Nullable Instant readTime)
, который вы можете использовать для чтений PITR:
- FirestoreV1.BatchGetDocuments
- FirestoreV1.ListCollectionIds
- FirestoreV1.СписокДокументов
- FirestoreV1.ЗапросРаздела
Ява
Следующий код можно использовать с примером кода конвейера 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 .
Экспорт и импорт из данных PITR
Вы можете экспортировать свою базу данных в Cloud Storage из данных PITR с помощью команды gcloud firestore export
. Вы можете экспортировать данные PITR, где метка времени представляет собой целую минуту в течение последних семи дней, но не ранее, чем earliestVersionTime
. Если данные больше не существуют в указанной метке времени, операция экспорта завершается неудачей.
Операция экспорта PITR поддерживает все фильтры, включая экспорт всех документов и экспорт определенных коллекций.
Экспортируйте базу данных, указав параметр
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 не взимается.
-
Импорт в базу данных.
Используйте шаги в Импорт всех документов для импорта экспортированной базы данных. Если какой-либо документ уже существует в вашей базе данных, он будет перезаписан.