备份和恢复数据
本页介绍了如何使用 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)'
。
您还可以使用一个对 - RETENTION_PERIOD_SECONDS:将此项设置为以秒为单位的值,后跟“s”。最大值为
8467200s
(即 14 周)。
google_firestore_database
类型的 Terraform 资源的资源引用。创建每周备份时间表
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)'
。
您还可以使用一个对 - RETENTION_PERIOD_SECONDS:将此项设置为以秒为单位的值,后跟“s”。最大值为
8467200s
(即 14 周)。 - DAY:在星期几进行备份。设置为以下其中一项:
SUNDAY
表示周日MONDAY
表示周一TUESDAY
表示周二WEDNESDAY
表示周三THURSDAY
表示周四FRIDAY
表示周五SATURDAY
表示周六
google_firestore_database
类型的 Terraform 资源的资源引用。列出备份时间表
如需列出数据库的所有备份时间表,请使用以下方法之一:
gcloud
使用gcloud firestore backups schedules list
命令。
gcloud firestore backups schedules list \ --database='DATABASE_ID'
'(default)'
。Firebase CLI
使用firebase firestore:backups:schedules:list
命令。
firebase firestore:backups:schedules:list \ --database 'DATABASE_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。
metadata
、name
和 response
这三个组成部分:
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。