备份和恢复数据

本页介绍了如何使用 Firestore 计划备份功能。使用备份可以保护您的数据免遭应用级数据损坏或意外的数据删除。

通过备份,您可以将备份时间表配置为每天或每周对指定的数据库进行备份。然后,您可以使用这些备份将数据恢复到新数据库。

备份简介

备份是指数据库在某个时间点的一致副本。备份包含该时间点的所有数据和索引配置。备份不包含数据库存留时间政策。备份与源数据库位于同一位置。

备份的保留期限可配置,并且会存储到保留期限到期或您删除备份为止。如果删除源数据库,将不会自动删除相关备份。

Firestore 会存储与数据库相关的备份和备份时间表的元数据。Firestore 会保留这些元数据,直到数据库的所有备份过期或被删除。

创建或保留备份的操作不会影响实时数据库中的读取或写入性能。

费用

使用备份时,您需要为以下各项支付费用:

  • 每个备份所使用的存储空间容量。
  • 对于恢复操作,您需要根据备份大小支付费用。

如需了解详情和确切费率,请参阅价格页面。

准备工作

确保您的 Google Cloud 项目已启用结算功能。 了解如何检查项目是否已启用结算功能

所需的角色

如需获取管理备份和备份时间表所需的权限,请让您的管理员为您授予以下一个或多个 Identity and Access Management 角色:

  • roles/datastore.owner:拥有对 Firestore 数据库的完整访问权限
  • 以下角色也可用,但不会在 Google Cloud 控制台中显示。使用 Google Cloud CLI 可分配这些角色:

    • roles/datastore.backupsAdmin:拥有对备份的读写权限
    • roles/datastore.backupsViewer:拥有对备份的读取权限
    • roles/datastore.backupSchedulesAdmin:拥有对备份时间表的读写权限
    • roles/datastore.backupSchedulesViewer:拥有对备份时间表的读取权限
    • roles/datastore.restoreAdmin:拥有启动恢复操作的权限

创建和管理备份时间表

以下示例演示了如何设置备份时间表。对于每个数据库,您最多可以配置一个每日备份时间表和一个每周备份时间表。您无法为一周中的不同日期配置多个每周备份时间表。

您无法配置备份的确切时段。系统会在每天的不同时间进行备份。对于每周备份时间表,您可以配置在星期几进行备份。

创建备份时间表

如需为数据库创建备份时间表,请使用 gcloud firestore backups schedules create 命令或 firebase firestore:databases:backups:schedules 命令。

创建每日备份时间表

gcloud
如需创建每日备份时间表,请将 --recurrence 标志设置为 daily
gcloud firestore backups schedules create \
--database='DATABASE_ID' \
--recurrence=daily \
--retention=RETENTION_PERIOD

替换以下内容:

  • DATABASE_ID:要备份的数据库的 ID。对于默认数据库,应设置为 '(default)'
  • RETENTION_PERIOD:将此项设置为一个不超过 14 周 (14w) 的值。
Firebase CLI
如需创建每日备份时间表,请将 --recurrence 标志设置为 DAILY
firebase firestore:backups:schedules:create \
--database 'DATABASE_ID' \
--recurrence 'DAILY' \
--retention RETENTION_PERIOD

替换以下内容:

  • DATABASE_ID:要备份的数据库的 ID。对于默认数据库,应设置为 '(default)'
  • RETENTION_PERIOD:将此项设置为一个不超过 14 周 (14w) 的值。
Terraform
如需创建每日备份时间表,请创建 google_firestore_backup_schedule 资源。
resource "google_firestore_backup_schedule" "daily-backup" {
  project  = PROJECT_ID
  database = DATABASE_ID

  retention = RETENTION_PERIOD_SECONDS

  daily_recurrence {}
}

请替换以下内容:

  • PROJECT_ID:项目的 ID。
  • DATABASE_ID:要备份的数据库的 ID。对于默认数据库,应设置为 '(default)'
  • 您还可以使用一个对 google_firestore_database 类型的 Terraform 资源的资源引用
  • RETENTION_PERIOD_SECONDS:将此项设置为以秒为单位的值,后跟“s”。最大值为 8467200s(即 14 周)。

创建每周备份时间表

gcloud
如需创建每周备份时间表,请将 --recurrence 标志设置为 weekly
gcloud firestore backups schedules create \
--database='DATABASE_ID' \
--recurrence=weekly \
--retention=RETENTION_PERIOD \
--day-of-week=DAY
替换以下内容:
  • DATABASE_ID:要备份的数据库的 ID。对于默认数据库,应设置为 '(default)'
  • RETENTION_PERIOD:将此项设置为一个不超过 14 周 (14w) 的值。
  • DAY:在星期几进行备份。设置为以下其中一项:
    • SUN 表示周日
    • MON 表示周一
    • TUE 表示周二
    • WED 表示周三
    • THU 表示周四
    • FRI 表示周五
    • SAT 表示周六
Firebase CLI
如需创建每周备份时间表,请将 --recurrence 标志设置为 WEEKLY
firebase firestore:backups:schedules:create \
--database 'DATABASE_ID' \
--recurrence 'WEEKLY' \
--retention RETENTION_PERIOD
--day-of-week DAY
替换以下内容:
  • DATABASE_ID:要备份的数据库的 ID。对于默认数据库,应设置为 '(default)'
  • RETENTION_PERIOD:将此项设置为一个不超过 14 周 (14w) 的值。
  • DAY:在星期几进行备份。设置为以下其中一项:
    • SUNDAY 表示周日
    • MONDAY 表示周一
    • TUESDAY 表示周二
    • WEDNESDAY 表示周三
    • THURSDAY 表示周四
    • FRIDAY 表示周五
    • SATURDAY 表示周六
Terraform
如需创建每周备份时间表,请创建 google_firestore_backup_schedule 资源。
resource "google_firestore_backup_schedule" "weekly-backup" {
  project  = PROJECT_ID
  database = DATABASE_ID

  retention = RETENTION_PERIOD_SECONDS

  weekly_recurrence {
    day = DAY
  }
}

请替换以下内容:

  • PROJECT_ID:项目的 ID。
  • DATABASE_ID:要备份的数据库的 ID。对于默认数据库,应设置为 '(default)'
  • 您还可以使用一个对 google_firestore_database 类型的 Terraform 资源的资源引用
  • RETENTION_PERIOD_SECONDS:将此项设置为以秒为单位的值,后跟“s”。最大值为 8467200s(即 14 周)。
  • DAY:在星期几进行备份。设置为以下其中一项:
    • SUNDAY 表示周日
    • MONDAY 表示周一
    • TUESDAY 表示周二
    • WEDNESDAY 表示周三
    • THURSDAY 表示周四
    • FRIDAY 表示周五
    • SATURDAY 表示周六

列出备份时间表

如需列出数据库的所有备份时间表,请使用以下方法之一:

gcloud
使用 gcloud firestore backups schedules list 命令。
gcloud firestore backups schedules list \
--database='DATABASE_ID'
DATABASE_ID 替换为相应数据库的 ID。对于默认数据库,请使用 '(default)'
Firebase CLI
使用 firebase firestore:backups:schedules:list 命令。
firebase firestore:backups:schedules:list \
--database 'DATABASE_ID'
DATABASE_ID 替换为相应数据库的 ID。对于默认数据库,请使用 '(default)'

描述备份时间表

如需检索备份时间表的相关信息,请使用以下方法之一:

gcloud
使用 gcloud firestore backups schedules describe 命令:
gcloud firestore backups schedules describe \
--database='DATABASE_ID' \
--backup-schedule=BACKUP_SCHEDULE_ID
替换以下内容:
  • DATABASE_ID:要备份的数据库的 ID。对于默认数据库,应设置为 '(default)'
  • BACKUP_SCHEDULE_ID:备份时间表的 ID。列出所有备份时间表后,您可以查看每个备份时间表的 ID。

更新备份时间表

如需更新备份时间表的保留期限,请使用以下方法之一:

gcloud
使用 gcloud firestore backups schedules update 命令:
gcloud firestore backups schedules update \
--database='DATABASE_ID' \
--backup-schedule=BACKUP_SCHEDULE_ID \
--retention=RETENTION_PERIOD
替换以下内容:
  • DATABASE_ID:要备份的数据库的 ID。对于默认数据库,应设置为 '(default)'
  • BACKUP_SCHEDULE_ID:备份时间表的 ID。列出所有备份时间表后,您可以查看每个备份时间表的 ID。
  • RETENTION_PERIOD:将此项设置为一个不超过 14 周 (14w) 的值。
Firebase CLI
使用 firebase firestore:backups:schedules:update 命令:
firebase firestore:backups:schedules:update \
BACKUP_SCHEDULE \
--retention RETENTION_PERIOD
替换以下内容:
  • BACKUP_SCHEDULE:备份时间表的完整资源名称。列出所有备份时间表后,您可以查看每个备份时间表的名称。
  • RETENTION_PERIOD:将此项设置为一个不超过 14 周 (14w) 的值。

您可以更新备份时间表的保留期限,但无法更新其重复周期。如果您需要一个重复周期不同的备份时间表,您可以删除不再需要的旧备份时间表,然后创建具有所需重复周期的新备份时间表。

删除备份时间表

如需删除备份时间表,请使用以下方法之一:

gcloud
使用 gcloud firestore backups schedules delete 命令:
gcloud firestore backups schedules delete \
--database='DATABASE_ID' \
--backup-schedule=BACKUP_SCHEDULE_ID
替换以下内容:
  • DATABASE_ID:要备份的数据库的 ID。对于默认数据库,应设置为 '(default)'
  • BACKUP_SCHEDULE_ID:备份时间表的 ID。列出所有备份时间表后,您可以查看每个备份时间表的 ID。
Firebase CLI
使用 firebase firestore:backups:schedules:delete 命令:
firebase firestore:backups:schedules:delete \
BACKUP_SCHEDULE
替换以下内容:
  • BACKUP_SCHEDULE:备份时间表的完整资源名称。列出所有备份时间表后,您可以查看每个备份时间表的名称。

请注意,删除备份时间表时,不会删除此时间表已创建的备份。您可以等待其在保留期限结束后过期;如需手动删除备份,请参阅删除备份

管理备份

列出备份

如需列出可用的备份,请使用以下方法之一:

gcloud
使用 gcloud firestore backups list 命令:
gcloud firestore backups list \
--format="table(name, database, state)"
--format="table(name, database, state)" 标志将输出的格式设置为更易于阅读的格式。如需仅列出来自特定位置的备份,请使用 --location 标志:
gcloud firestore backups list \
--location=LOCATION \
--format="table(name, database, state)"
LOCATION 替换为 Firestore 位置的名称。
Firebase CLI
使用 firebase firestore:backups:list 命令:
firebase firestore:backups:list
如需仅列出来自特定位置的备份,请使用 --location 标志:
firebase firestore:backups:list \
--location=LOCATION
LOCATION 替换为 Firestore 位置的名称。

描述备份

如需查看备份的详细信息,请使用以下方法之一:

gcloud
使用 gcloud firestore backups describe 命令:
gcloud firestore backups describe \
--location=LOCATION \
--backup=BACKUP_ID
替换以下内容:
  • LOCATION:数据库的位置。
  • BACKUP_ID:备份的 ID。您可以列出所有备份以查看每个备份的 ID。
Firebase CLI
使用 firebase firestore:backups:get 命令:
firebase firestore:backups:get BACKUP
替换以下内容:
  • BACKUP:备份的完整资源名称。您可以列出所有备份以查看每个备份的名称。

删除备份

如需删除备份,请使用以下方法之一。警告:您无法恢复被删除的备份。
gcloud
使用 gcloud firestore backups delete 命令:
gcloud firestore backups delete \
--location=LOCATION \
--backup=BACKUP_ID
替换以下内容:
  • LOCATION:数据库的位置。
  • BACKUP_ID:备份的 ID。您可以列出所有备份以查看每个备份的 ID。
Firebase CLI
使用 firebase firestore:backups:delete 命令:
firebase firestore:backups:delete \
BACKUP
替换以下内容:
  • BACKUP:备份的完整资源名称。您可以列出所有备份以查看每个备份的名称。

通过数据库备份恢复数据

恢复操作会将备份中的数据写入新的 Firestore 数据库。

如需开始恢复操作,请使用以下方法之一:

gcloud
使用 gcloud firestore databases restore 命令:
gcloud firestore databases restore \
--source-backup=projects/PROJECT_ID/locations/LOCATION/backups/BACKUP_ID \
--destination-database='DATABASE_ID'
替换以下内容:
  • PROJECT_ID:您的项目 ID。
  • LOCATION:数据库备份的位置以及为恢复的数据创建的新数据库的位置。
  • BACKUP_ID:备份的 ID。 您可以列出所有备份以查看每个备份的 ID。
  • DATABASE_ID:新数据库的 ID。您无法使用已被使用的数据库 ID。
数据库模式将与备份的模式一致。 输出将包含 metadatanameresponse 这三个组成部分:
metadata:
  '@type': type.googleapis.com/google.firestore.admin.v1.RestoreDatabaseMetadata
  backup: projects/PROJECT_ID/locations/LOCATION/backups/BACKUP_ID
  database: projects/PROJECT_ID/databases/DATABASE_ID
  operationState: PROCESSING
  progressPercentage:
    completedWork: '20'
    estimatedWork: '100'
  startTime: '2023-12-06T14:20:17.398325Z'
name: projects/PROJECT_ID/databases/DATABASE_ID/operations/operation_uuid
response:
  '@type': type.googleapis.com/google.firestore.admin.v1.Database
  createTime: '2023-12-06T14:20:17.398325Z'
  name: projects/PROJECT_ID/databases/DATABASE_ID
  ...
metadata 字段包含一个 progressPercentage 组成部分(详细说明目前为止恢复的估算进度)和一个 operationState(用于指定恢复的总体状态)。如需再次检索此信息,请使用 gcloud firestore operations list
gcloud firestore operations list --database=DATABASE_ID
或者,将上述输出中的 name 字段与 gcloud firestore operations describe 搭配使用:
gcloud firestore operations describe OPERATION_NAME
Firebase CLI
使用 firebase firestore:databases:restore 命令:
firebase firestore:databases:restore \
--backup 'BACKUP' \
--database 'DATABASE_ID'
替换以下内容:
  • BACKUP:备份的完整资源名称。您可以列出所有备份以查看每个备份的名称。
  • DATABASE_ID:新数据库的 ID。您无法使用已被使用的数据库 ID。
数据库模式将与备份的模式一致。