备份概览

本文档简要介绍了 Spanner 备份和备份时间表。

借助 Spanner,您可以按需创建数据库的完整备份,也可以使用备份时间表创建完整备份或增量备份。完整备份会存储数据库的全部数据,而增量备份仅包含自上次备份以来发生了更改的数据。

当操作员或应用错误导致逻辑数据损坏时,您可以恢复备份。

备份具有高可用性,经过加密,可在创建后保留长达一年的时间。创建备份时,备份与其源数据库位于同一实例、区域和项目中。如果出于合规性或业务连续性原因,您需要在其他区域或项目中恢复备份,则可以将备份复制到其他区域或项目中的实例。

每个备份都有关联的 createTimeversionTimecreateTime 是 Spanner 开始创建备份的时间戳。 versionTime 是备份中捕获数据库内容的时间戳。备份包含数据库在 versionTime 的一致视图。

对于按需备份,默认情况下 createTimeversionTime 相同。如有需要,您可以在创建按需备份时指定较早的 versionTime,前提是该时间点在数据库的版本保留期限内。

对于定期备份,versionTime 是您在创建备份时间表时选择的时间。Spanner 会在 versionTime 后的 4 小时内开始创建备份,因此 createTime 会在此 4 小时内。这与按需备份不同,在按需备份中,Spanner 会在收到请求时开始创建备份。

例如,假设您创建了一个备份时间表,其频率为 0 7 * * * UTC,即每天凌晨 7:00(世界协调时间 [UTC])备份一次。这意味着,对于每次备份,versionTime 都会设置为世界协调时间 (UTC) 上午 7:00,而 createTime 是世界协调时间 (UTC) 上午 7:00 到上午 11:00 之间这 4 小时时段内的时间戳。

如需详细了解如何使用 API 来使用 createTimeversionTime,请参阅备份 API 参考文档

主要特性

  • 数据一致性:Spanner 数据库的备份在 versionTime 备份时具有事务一致性和外部一致性

  • 复制:备份与源数据库位于同一实例中,并在同一地理位置进行复制。 对于区域实例,三个读写地区各自都存储有备份。对于双区域多区域实例,备份存储在包含读写副本或只读副本的所有地区中。如果您需要将数据库备份存储在其他区域或项目中,可以将源实例中的已完成备份复制到位于其他区域或项目中的目标实例。如需了解详情,请参阅复制备份

  • 自动到期:所有备份都有一个用户指定的失效日期,用于确定何时自动删除该备份。 Spanner 会以异步方式删除失效的备份,因此备份失效和实际删除之间可能会有延迟。

创建备份

创建备份时,备份与其源数据库位于同一实例、区域和项目中。

备份包含以下信息(来自备份创建时间点 versionTime 的数据库):

  • 完整备份包含所有数据。增量备份仅包含自上次备份以来发生了更改的数据。
  • 架构信息,包括表名称、字段、数据类型、二级索引、变更数据流以及这些实体之间的关系。
  • 使用 ALTER DATABASE SET OPTIONS 命令设置的所有数据库选项。

Spanner 备份不包含以下信息:

  • versionTime 之后对数据或架构进行的任何修改都不会包含在备份中。
  • Identity and Access Management (IAM) 政策。
  • 变更数据流数据记录。虽然变更数据流架构会存储,但变更数据流数据旨在流式传输并近乎同步地使用其描述的变更。

为确保备份的外部一致性,Spanner 会在 versionTime 固定数据库的内容。这样可以防止垃圾回收系统在备份操作期间移除相关数据值。然后,实例中的每个读/写和只读可用区开始并行复制数据。如果任何可用区暂时不可用,则直到该可用区恢复在线后,备份才会完成。备份在操作完成后立即恢复。对于多区域实例,所有区域中的所有读写和只读可用区都必须完成其备份副本,然后才能将备份标记为可恢复。

备份时间表

Spanner 允许您为数据库安排完整备份或增量备份。增量备份仅包含自上次备份以来发生了更改的数据,而完整备份则存储数据库的全部内容。您可以指定备份时间表类型(完整或增量)和频率,以便 Spanner 创建备份。

完整备份时间表可以每 12 小时或更长时间创建一次备份。增量备份时间表可以每 4 小时或更长时间创建一次备份。

Spanner 通过备份时间表为数据库提供增量备份。您无法按需创建增量备份。

备份创建会在所安排时间的四小时内开始。 每个数据库最多可以有 4 个备份时间表。

增量备份

增量备份会在完整备份之间形成。增量备份时间表创建的第一个备份是完整备份。链中创建的连续备份是增量备份,每个备份仅包含自链中上一个备份以来发生变化的数据。

除了初始完整备份之外,Spanner 还允许每个链最多包含 13 个增量备份。链由相应的 incrementalBackupChainId 值标识。当链达到最大长度时,Spanner 会创建一个新链,从初始完整备份开始。

在某些情况下,Spanner 可能会在达到最大链长度之前创建新链。以下是一些应用场景:

  • 最旧的完整备份是在 28 天或更长时间之前创建的。
  • 链中最新的备份会被删除。
  • 增量备份时间表已修改。

以下是一些有助于您决定是否使用增量备份的因素:

  • 加密:增量备份仅支持使用Google-owned and Google-managed encryption keys 进行加密,即使数据库使用客户管理的加密密钥 (CMEK) 进行加密也是如此。

  • 恢复:恢复增量备份可能比恢复包含相同数据的完整备份花费更长时间。

  • 删除:如果您删除链中的某个备份或该备份过期,Spanner 仍可能会保留该备份,以支持链中较新的备份(如果有)。Spanner 需要链中的所有旧备份才能恢复增量备份。如需删除备份链中的所有数据(包括过期或已删除备份中的数据),请删除该链中的所有备份。

  • 保留:每个备份时间表都有以下条款,可提供有关时间表的信息:

    • creation_interval:表示备份时间表的指定时间表频率。
    • retention_duration:表示时间表所创建的备份的保留时长。 对于给定的链,如果需要使用最旧的完整备份来支持链中较新的备份,则即使该备份已过其原始过期日期,也会保留该备份。完整备份的总保留时长最多为以下两个值中的较小者:
      • retention_duration + 28 天
      • retention_duration + (creation_interval*14)
  • 备份副本:复制增量备份时,Spanner 还会复制链中恢复所复制备份所需的所有旧备份。如果目标实例已包含以从同一源链复制的旧备份结尾的备份链,Spanner 会避免创建现有备份的冗余副本。相反,Spanner 只会复制增量备份和目标链中不存在的任何旧备份,并将这些备份附加到现有链中。Spanner 会根据您使用的总存储空间向您收取费用。

    例如,如果您设置了每日增量备份时间表,并每天复制最新备份,则目标实例会维护与源链镜像的备份链。在后续复制操作中,Spanner 不会复制链中之前已复制的备份。

    虽然 Spanner 旨在避免冗余副本,但在极少数情况下,Spanner 可能需要复制链中的所有旧备份,即使目标实例中已存在之前复制的备份也是如此。

如需详细了解如何创建增量备份,请参阅创建和管理备份时间表

默认备份时间表

创建新的 Spanner 实例时,您可以指定是否希望 Spanner 为该实例中的每个新数据库创建默认备份时间表。默认备份时间表会每 24 小时创建一次完整备份。这些备份的保留期限为 7 天。默认备份时间表创建完成后,您可以修改或删除。

系统会自动为所有新实例启用默认备份时间表。您可以在创建实例时,或是以后通过修改实例,在实例中启用或停用默认备份时间表。

您可以为现有实例启用默认备份时间表。 不过,默认备份时间表不适用于实例中的现有数据库。默认备份时间表仅适用于实例中的新数据库。

默认备份时间表需要 24 小时才能生效并开始创建备份。

您必须先删除实例中的所有备份,然后才能删除实例。如果您创建和删除实例是为了进行测试,则可以在 24 小时内删除新实例,以免手动删除其备份。

如需了解如何启用或停用默认备份时间表,请参阅修改默认备份时间表类型

完整备份和增量备份的存储费用

每个 Spanner 备份都包含以下字段,可提供有关存储空间消耗的信息:

  • exclusiveSizeBytes:显示备份所需的字节数。此大小表示备份的计费大小。
  • freeableSizeBytes:显示删除备份后释放的字节数。
  • oldestVersionTime:显示链中最旧的完整备份的 versionTime,即使该备份已过期。您可以使用此字段了解正在存储哪些数据。

增量备份可为您节省存储费用。增量备份的 exclusiveSizeBytes 字段可能比完整备份小得多,因为增量备份只需要存储自链中上一次备份以来的更改。 为链中的每个备份添加此字段值可反映链中备份使用的总字节数。

增量备份在恢复时依赖于同一链中的所有旧备份。 这意味着,如果存在较新的增量备份,则链中所有较旧备份的数据都无法从系统中删除,并且同一链中所有较旧备份的 freeableSizeBytes 字段均为零。

假设您为大小为 100 GB 且每天增加 10 GB 的数据库创建了完整备份时间表和增量备份时间表。下表显示了这些备份计划可能产生的存储费用:

完整时间表备份大小 增量备份的大小
1 100 GB 100 GB
2 110 GB 10 GB
3 120 GB 10 GB
4 130 GB 10 GB
5 140 GB 10 GB

在 5 天内,完整备份计划会使用 600 GB 的存储空间,而增量备份计划会使用大约 140 GB 的存储空间。 对于增量备份计划,完整备份大小是链中所有备份(包括该备份)的大小的总和,并反映在 sizeBytes 字段中。

备份复制的运作方式

借助 Spanner,您可以将 Spanner 数据库的备份从一个实例复制到位于不同区域或项目中的另一个实例,以提供额外的数据保护和合规性功能。

如果目标或源 Google Cloud 区域出现故障,您将无法复制备份。 为防止数据因区域性服务中断而丢失,您需要定期将备份复制到受影响区域之外的位置。

复制的备份与原始备份具有相同的主要功能。此外,您还可以在与复制的备份相同的实例中恢复复制的备份,以支持跨区域和跨项目的备份与恢复使用情形。

Spanner 备份的存储位置

备份是 Spanner 中的资源。 每个备份资源都安排在资源层次结构中与其源数据库相同的实例下,并具有采用以下格式的资源路径:

projects/PROJECT_ID/instances/INSTANCE_ID/backups/BACKUP_NAME

请替换以下内容:

  • PROJECT_ID:项目 ID。
  • INSTANCE_ID:实例 ID。
  • BACKUP_NAME:备份名称。

即使在备份的源数据库被删除后,备份仍会继续存在,但不会超过其父实例的生命周期。为防止意外删除备份,您无法删除存在备份的 Spanner 实例。如果您想删除实例,我们建议先恢复备份,然后导出恢复的数据库,然后再删除备份和实例。

加密

Spanner 备份(如数据库)由Google-owned and Google-managed encryption keys 或客户管理的加密密钥 (CMEK) 进行加密。默认情况下,备份使用与其数据库相同的加密配置,但您可以在创建备份时指定不同的加密配置来替换此行为。如果备份启用了 CMEK,则在创建备份时会使用主要版本的 KMS 密钥对备份进行加密。创建备份后,即使 KMS 密钥已轮替,其密钥和密钥版本也无法修改。如需了解详情,请参阅创建启用 CMEK 的备份

复制的备份会使用与其源备份加密相同的加密配置,即Google-owned and Google-managed encryption keys 或客户管理的加密密钥 (CMEK)。您可以通过在复制备份时指定不同的加密配置来替换此行为。如果您希望在跨区域复制时使用 CMEK 对复制的备份进行加密,请指定与目标区域对应的 Cloud KMS 密钥

您可以在创建或修改备份时间表时指定加密配置。如果您希望备份时间表创建由 CMEK 密钥加密的备份,则需要指定密钥路径。

增量备份仅支持使用Google-owned and Google-managed encryption keys进行加密,即使数据库由 CMEK 密钥加密也是如此。

性能

本部分介绍了 Spanner 中的最佳备份性能。

备份性能

执行备份时,Spanner 会创建一个备份作业,以将数据从数据库直接复制到备份存储空间,并根据数据库大小调整此作业的大小。此备份作业不使用分配给数据库实例的 CPU 资源,因此不会影响实例的性能。此外,数据库实例上的计算负载不会影响备份操作的速度。如需跟踪备份操作的进度和完成情况,请参阅显示备份进度

一般来说,大多数备份需要 1-4 小时。由于备份大小或资源内部排队,某些备份可能需要更长时间。如果在没有其他因素更改时,备份花费的时间比平常长,则可能是由于在可用区中安排备份任务时发生延迟。此过程有时最多可能需要 30 分钟。我们建议您不要取消并重启备份,因为使用新备份操作时您可能会遇到相同的时间安排延迟。

复制备份时的性能

复制备份所需的时间取决于多种因素,例如源备份的大小以及为复制的备份选择的目标区域。一般来说,大多数复制操作会在 1-4 小时内完成。某些复制操作可能需要更长时间,具体取决于备份大小和目标区域。复制备份不会对源实例或数据库产生任何性能影响。您可以同时将源备份复制到不同区域的多个实例,而不会对性能产生任何影响。

复制增量备份时,Spanner 还会复制链中恢复所复制备份所需的所有旧备份。为了提高性能,Spanner 会同时复制所有备份,而不是按顺序复制。Spanner 还会尽可能避免复制同一链中的旧备份。如需了解详情,请参阅增量备份

删除备份

如果您删除增量备份,但同一链中存在较新的增量备份,那么您可能无法恢复存储空间。较新的增量备份依赖于已删除的增量备份以及链中较旧的备份中的数据。Spanner 会保留数据,只有在所有较新的增量备份过期后才会释放存储空间。freeableSizeBytes 字段显示了删除备份后可以恢复多少存储空间。

价格

系统会根据您的备份每单位时间使用的存储量向您收取费用。备份操作完成后,便开始计费,并且将持续计费直到删除备份为止。已完成的备份将至少收取 24 小时的费用。如果您创建了备份,然后在备份完成后很快将其删除,则您仍需支付 24 小时的费用。

备份的副本与原始备份一样,需要支付相同的存储费用。如果您在位于不同区域的两个实例之间创建副本,则需要支付出站数据传输费用

例如,如果您将数据库从源多区域实例配置 nam7 复制到目标多区域实例配置 nam-eur-asia3,则需支付以下费用:

  • 重叠的 us-central1 区域不收费
  • 见证者 us-central2 区域不收取费用
  • 洲际数据传输费用需支付两次:一次针对每个新大陆(欧洲和亚洲)
  • 同一大洲内不同区域之间的数据传输费用仅针对 us-east1 收取一次
  • 同一大洲内不同区域之间的数据传输费用在欧洲仅收取一次

Spanner 会优化复制过程,以尽可能减少跨区域传输的次数。这有助于最大限度地降低数据传输费用,同时提供快速的复制备份体验。

备份会单独存储和计费。备份存储空间不会影响数据库存储空间的结算数据库存储空间限制。如需了解详情,另请参阅存储空间利用率指标

如需详细了解备份费用,请参阅 Spanner 价格

后续步骤