Blob 版本控制

可以启用 Blob 存储版本控制来自动维护对象的先前版本。 启用 blob 版本控制后,如果修改或删除了数据,可以访问 blob 的先前版本以恢复数据。

Blob 版本控制是针对 blob 数据的综合性数据保护策略的一部分。 为实现 blob 数据的最佳保护,建议启用以下所有数据保护功能:

  • Blob 版本控制,用于自动维护 blob 的先前版本。 启用 blob 版本控制后,如果错误地修改或删除了数据,则可以还原 blob 的先前版本以恢复数据。 若要了解如何启用 blob 版本控制,请参阅启用和管理 blob 版本控制
  • 容器软删除,用于还原已删除的容器。 若要了解如何启用容器软删除,请参阅启用和管理容器的软删除
  • Blob 软删除,用于还原已删除的 Blob、快照或版本。 若要了解如何启用 blob 软删除,请参阅启用和管理 blob 的软删除

若要详细了解 Azure 的数据保护建议,请参阅数据保护概述

注意

为存储帐户启用 Blob 版本控制后,对该帐户中的 Blob 执行的每个写入操作都会创建一个新版本。 因此,启用 Blob 版本控制可能会导致额外的成本。 若要尽量降低成本,请使用生命周期管理策略自动删除旧版本。 有关生命周期管理的详细信息,请参阅通过自动执行 Azure Blob 存储访问层来优化成本

Blob 版本控制的工作原理

版本在给定时间点捕获 blob 的状态。 每个版本都由一个版本 ID 标识。 为存储帐户启用 blob 版本控制后,首次创建 blob 时以及随后每次修改 blob 时,Azure 存储都会自动创建一个具有唯一 ID 的新版本。

版本 ID 可以标识当前版本或先前版本。 一个 blob 一次只能有一个当前版本。

创建一个新的 blob 时,存在一个版本,该版本就是当前版本。 修改现有 blob 时,当前版本将变为先前版本。 将创建一个新版本以捕获更新的状态,该新版本即为当前版本。 删除某个 blob 时,该 blob 的当前版本将变成先前版本,并且不再存在当前版本。 Blob 的任何先前版本都将保留。

下图显示了如何在写入操作中创建版本,以及如何将先前版本提升为当前版本:

显示 blob 版本控制工作原理的示意图

Blob 版本是不可变的。 不能修改现有 blob 版本的内容或元数据。

如果每个 blob 都具有大量版本,则会增加 blob 列表操作的延迟。 Azure 建议每个 blob 保留的版本少于 1000 个。 可以使用生命周期管理来自动删除旧版本。 有关生命周期管理的详细信息,请参阅通过自动执行 Azure Blob 存储访问层来优化成本

Blob 版本控制可用于标准常规用途 v2、高级块 blob 和旧版 Blob 存储帐户。 当前不支持已启用分层命名空间以与 Azure Data Lake Storage Gen2 结合使用的存储帐户。

Azure 存储 REST API 2019-10-10 版及更高版本支持 blob 版本控制。

重要

Blob 版本控制无法帮助你恢复意外删除的存储帐户或容器。 若要防止意外删除存储帐户,请在存储帐户资源上配置一个锁定。 有关锁定存储帐户的详细信息,请参阅将 Azure 资源管理器锁定应用于存储帐户

版本 ID

每个 blob 版本都由一个唯一版本 ID 标识。 版本 ID 的值是更新 blob 时的时间戳。 创建版本时分配版本 ID。

可以通过提供 blob 的特定版本 ID 来对其执行读取或删除操作。 如果省略了版本 ID,则操作将针对当前版本进行。

调用写入操作来创建或修改 blob 时,Azure 存储将在响应中返回 x-ms-version-id 标头。 此标头包含由写入操作创建的 blob 的当前版本的版本 ID。

版本 ID 在版本的生存期内保持不变。

写入操作时的版本控制

启用 blob 版本控制后,对 blob 的每次写入操作都会创建一个新版本。 写入操作包括放置 Blob放置块列表复制 Blob设置 Blob 元数据

如果写入操作创建了新的 blob,则生成的 blob 为 blob 的当前版本。 如果写入操作修改了现有 blob,则当前版本将成为先前版本,并创建新的当前版本以捕获更新的 blob。

下图显示了写入操作对 blob 版本的影响。 为简单起见,本文中的示意图将版本 ID 显示为一个简单的整数值。 实际上,版本 ID 是一个时间戳。 当前版本显示为蓝色,先前版本显示为灰色。

显示写入操作如何影响接受版本控制的 blob 的示意图。

注意

如果 blob 是在为存储帐户启用版本控制之前创建的,则它没有版本 ID。 修改该 blob 时,修改后的 blob 将成为当前版本,并将创建一个版本来保存 blob 在更新前的状态。 为版本分配的版本 ID 是其创建时间。

为存储帐户启用 blob 版本控制后,除 放置块 操作外,针对块 blob 的所有写入操作都会触发新版本创建。

对于页 blob 和追加 blob,只有一部分写入操作会触发版本创建。 这些操作包括:

以下操作不会触发新版本创建。 若要从这些操作捕获更改,请手动生成快照:

Blob 的所有版本必须具有相同的 blob 类型。 如果 blob 有先前版本,除非先删除该 blob 及其所有版本,否则无法使用另一种类型的 blob 覆盖一种类型的 blob。

删除操作时的版本控制

如果在调用 删除 Blob 操作时未指定版本 ID,当前版本会变成先前版本,且不再存在。 将保留该 blob 的所有现有先前版本。

下图显示了删除操作对接受版本控制的 blob 的影响:

显示删除接受版本控制的 blob 的示意图。

若要删除 blob 的特定版本,请在删除操作中提供该版本的 ID。 如果还为存储帐户启用了 blob 软删除,则在软删除保持期结束之前,该版本将保留在系统中。

将新数据写入 blob 时将创建 blob 的新当前版本。 任何现有版本不受影响,如下图所示。

显示在删除后重新创建接受版本控制的 blob 的示意图。

访问层级

可以通过调用设置 Blob 层操作将块 blob 的任何版本(包括当前版本)移到不同的 blob 访问层。 要利用较低的容量定价,可以将较早版本的 blob 移到冷访问层或存档访问层。 有关详细信息,请参阅 Blob 数据的热访问层、冷访问层、寒访问层和存档访问层

若要自动将块 blob 移到相应的层,请使用 blob 生命周期管理。 有关生命周期管理的详细信息,请参阅管理 Azure Blob 存储生命周期

启用或禁用 blob 版本控制

若要了解如何启用或禁用 blob 版本控制,请参阅启用和管理 blob 版本控制

禁用 blob 版本控制不会删除现有的 blob、版本或快照。 关闭 blob 版本控制后,任何现有版本在存储帐户中仍可访问。 后续不会再创建新版本。

禁用版本控制后,修改当前版本会创建非版本的 blob。 对该 blob 的所有后续更新都会覆盖其数据,不会保存先前状态。 所有现有版本都保持为以前的版本。

禁用版本控制后,可以使用版本 ID 读取或删除版本。 禁用版本控制后,还可以列出 blob 的版本。

对象复制依赖于 blob 版本控制。 必须先删除帐户上的任何对象复制策略,然后才能禁用 blob 版本控制。 有关对象复制的详细信息,请参阅针对块 Blob 的对象复制

下图显示了禁用版本控制后,修改 blob 时如何创建未接受版本控制的 blob。 与 blob 关联的任何现有版本都将保持不变。

此图显示了禁用版本控制后,修改当前版本会创建非版本的 blob。

Blob 版本控制和软删除

Blob 版本控制和 Blob 软删除是推荐用于存储帐户的数据保护配置的一部分。 有关 Azure 提供的数据保护建议的详细信息,请参阅本文中的推荐的数据保护配置,以及数据保护概述

覆盖 blob

如果为存储帐户同时启用 blob 版本控制和 blob 软删除,则覆盖某个 blob 将自动创建一个新版本。 系统不会软删除新版本,并且不会在软删除保留期到期时删除该版本。 不会创建软删除的快照。

删除 blob 或版本

如果为存储帐户同时启用版本控制和软删除,则在删除某个 blob 时,该 blob 的当前版本将成为先前版本。 不会创建新版本,也不会创建软删除的快照。 软删除保持期对于删除的 blob 不起作用。

软删除为删除 blob 版本提供额外的保护。 删除 blob 的先前版本时,该版本将被软删除。 软删除的版本保存到软删除保持期结束为止,届时,会永久删除该版本。

若要删除 blob 的先前版本,请调用“删除 Blob”操作并指定版本 ID。

下图显示了在删除 blob 或 blob 版本时会发生的情况。

显示删除已启用软删除的版本的示意图。

还原软删除的版本

在软删除保持期内,可使用撤消删除 Blob 操作来还原软删除的版本。 “撤消删除 Blob”操作始终会还原 blob 的所有软删除版本。 无法做到只还原一个已软删除的版本。

使用 撤消删除 Blob 操作还原软删除的版本不会将任何版本提升为当前版本。 若要还原当前版本,请首先还原所有软删除的版本,然后使用复制 Blob 操作将先前版本复制到新的当前版本。

下图显示了如何通过“撤销删除 Blob”操作还原软删除的 blob 版本,以及如何通过“复制 Blob”操作还原 blob 的当前版本 。

显示如何还原软删除的版本的示意图。

在软删除保留期结束之后,将永久删除任何软删除的 blob 版本。

Blob 版本控制和 blob 快照

Blob 快照是在某一特定时间点拍摄的 blob 的只读副本。 Blob 快照和 blob 版本类似,但快照是由你或你的应用程序手动创建的,而 blob 版本是在为存储帐户启用 blob 版本控制后,在写入或删除操作中自动创建的。

重要

Azure 建议在启用 blob 版本控制后,还应更新应用程序以停止为块 blob 拍摄快照。 如果存储帐户启用了版本控制,则将按版本捕获和保留所有块 blob 更新和删除。 如果启用了 blob 版本控制,则拍摄快照不会向块 blob 数据提供任何额外的保护,并且可能会增加成本和应用程序复杂性。

启用版本控制时为 blob 拍摄快照

虽然不建议这样做,但可以为也接受了版本控制的 blob 拍摄快照。 如果在启用版本控制时无法更新应用程序以停止为 blob 拍摄快照,则应用程序可以支持快照和版本。

为接受版本控制的 blob 拍摄快照时,会在创建快照的同时创建一个新版本。 在拍摄快照时,还会创建一个新的当前版本。

下图显示为接受版本控制的 blob 拍摄快照时会发生的情况。 在此示意图中,版本 ID 为 2 和 3 的 blob 版本和快照包含相同的数据。

显示接受版本控制的 blob 的快照的示意图。

授予对 blob 版本的操作权限

可以使用以下方法之一来授予对 blob 版本的访问权限:

  • 使用 Azure 基于角色的访问控制 (Azure RBAC) 向 Microsoft Entra 安全主体授予权限。 Microsoft 建议使用 Microsoft Entra ID 来实现优异的安全性和易用性。 有关通过 Blob 操作使用 Microsoft Entra ID 的详细信息,请参阅授权访问 Azure 存储中的数据
  • 通过使用共享访问签名 (SAS) 来委托对 blob 版本的访问权限。 为已签名的资源类型 bv(表示 blob 版本)指定版本 ID,以创建针对特定版本的操作的 SAS 令牌。 有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS) 授予对 Azure 存储资源的有限访问权限
  • 通过使用帐户访问密钥向具有共享密钥的 blob 版本授予操作权限。 有关详细信息,请参阅通过共享密钥进行授权

Blob 版本控制旨在保护数据免遭意外或恶意删除。 为了增强保护,删除 blob 版本时需要特殊权限。 以下各节描述了删除 blob 版本所需的权限。

用于删除 blob 版本的 Azure RBAC 操作

下表显示了支持删除 blob 或 blob 版本的 Azure RBAC 操作。

说明 Blob 服务操作 需要 Azure RBAC 数据操作 Azure 内置角色支持
删除当前版本 删除 Blob Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete 存储 Blob 数据参与者
删除先前版本 删除 Blob Microsoft.Storage/storageAccounts/blobServices/containers/blobs/deleteBlobVersion/action 存储 Blob 数据所有者

共享访问签名 (SAS) 参数

Blob 版本的已签名资源为 bv。 有关详细信息,请参阅创建服务 SAS创建用户委托 SAS

下表显示了在 SAS 上删除 blob 版本时所需的权限。

权限 URI 符号 允许的操作
删除 x 删除 blob 版本。

定价和计费

启用 blob 版本控制可能会导致帐户产生额外的数据存储费用。 设计应用程序时,务必注意在哪些情况下会产生这些费用,以便最大程度地降低成本。

Blob 版本和 blob 快照一样,按与活动数据相同的费率计费。 如何对版本进行计费取决于是否已为当前版本或以前版本的 blob(或快照)显式设置层级。 有关 Blob 层的详细信息,请参阅 Blob 数据的热访问层、冷访问层、寒访问层和存档访问层

如果尚未更改 blob 或版本的层级,会针对该 blob、其版本及其可能拥有的任何快照中唯一的数据块进行计费。 有关详细信息,请参阅在未显式设置 blob 层级时进行计费

如果已更改 blob 或版本的层级,会针对整个对象进行计费,不考虑 blob 和版本最终是否在同一层级中。 有关详细信息,请参阅在显式设置了 blob 层级时进行计费

注意

为频繁覆盖的数据启用版本控制可能会增加存储容量费用,并增加列出操作期间的延迟。 若要缓解这些问题,请将频繁覆盖的数据存储在禁用了版本控制的单独存储帐户中。

有关 blob 快照的计费详细信息,请参阅 Blob 快照

在未显式设置 blob 层级时进行计费

如果尚未为 blob 的任何版本显式设置 blob 层级,会针对所有版本的唯一块或页面及其可能拥有的任何快照向你收费。 对于跨 blob 版本共享的数据,只会收费一次。 当 blob 更新时,新的当前版本的 blob 中的数据与以前版本中存储的数据将会相异,并且会按块或页面对不重复的数据进行计费。

在替换块 Blob 中的某个块后,会将该块作为唯一块进行收费。 即使该块具有的块 ID 和数据与它在先前版本中所具有的 ID 和数据相同也是如此。 重新提交块后,它会与它在先前版本中的对应部分相异,且会针对其数据向你收费。 对于使用相同数据更新的页 Blob 中的页面来说,情况也是如此。

Blob 存储无法确定两个块是否包含相同的数据。 每个上传和提交的块均被视为唯一的块,即使它具有相同的数据和块 ID 也是如此。 由于不重复的块会产生费用,因此请务必记住,在启用版本控制后更新 Blob 将导致产生更多不重复的块和额外费用。

启用 blob 版本控制后,请对块 blob 调用更新操作,以使它们更新尽可能少的块。 允许对块进行精细控制的写入操作是放置块放置块列表。 另一方面,放置 Blob 操作会替换 blob 的全部内容,因此可能会导致额外的费用。

以下场景说明了尚未显式设置 blob 层级时,块 blob 及其版本会在哪些情况下产生费用。

方案 1

在方案 1 中,blob 具有先前版本。 自版本创建以来,blob 尚未更新,因此仅针对唯一块 1、2 和 3 产生费用。

图 1 显示了如何对基本 blob 和先前版本中不重复的块进行计费。

方案 2

在方案 2 中,blob 中的一个块(图中的块 3)已更新。 即使更新的块包含相同的数据和 ID,它也与先前版本中的块 3 不同。 因此,帐户需要为四个块支付费用。

图 2 显示了如何对基本 blob 和先前版本中不重复的块进行计费。

方案 3

在场景 3 中,已更新 blob,但尚未更新版本。 块 3 已替换为当前 blob 中的块 4,但先前版本仍反映块 3。 因此,帐户需要为四个块支付费用。

图 3 显示了如何对基本 blob 和先前版本中不重复的块进行计费。

方案 4

在方案 4 中,已完全更新当前版本,并且其中不包含任何原始块。 因此,该帐户将为所有八个不重复的块付费,其中四个在当前版本中,四个在两个先前版本中。 如果正在使用 放置 Blob 操作写入 blob,会发生这种情况,因为它会替换 blob 的全部内容。

图 4 显示了如何对基本 blob 和先前版本中不重复的块进行计费。

在显式设置了 blob 层级时进行计费

如果已为 blob 或版本(或快照)显式设置 blob 层级,会针对新层级中对象的完整内容长度向你收费,不考虑它是否与原始层级中的对象共享块。 还会针对原始层级中最早版本的完整内容长度向你收费。 对于保留在原始层级中的任何其他先前版本或快照,都将针对其可能共享的不重复的块进行计费,如在未显式设置 blob 层级时进行计费中所述。

将 blob 移到新层级

下表描述了将 blob 或版本移动到新层级时的计费行为。

当设置了 blob 层级时… 然后,针对以下内容进行计费...
针对某个版本(当前版本或以前版本)显式设置 该版本的完整内容长度。 对于未显式设置层级的版本,仅针对不重复的块计费。1
存档 所有版本和快照的完整内容长度。1

1如果有其他先前版本或快照尚未从其原始层级中移出,会根据这些版本或快照包含的唯一块的数量向其收费,如 在尚未显式设置 blob 层级时进行计费 中所述。

下图说明了当接受版本控制的 blob 移到另一个层级时,如何针对对象进行计费。

此图显示了当对接受版本控制的 blob 显式分层时,如何针对对象进行计费。

为 blob、版本或快照显式设置层级的操作不能撤消。 如果将 blob 移动到新层级,然后将其移回其原始层级,则即使该对象与原始层级中的其他对象共享块,也会针对其完整内容长度向你收费。

显式设置 blob、版本或快照的层级的操作包括:

在启用了软删除的情况下删除 blob

启用 blob 软删除后,所有软删除的实体将按完整内容长度进行计费。 如果你删除或覆盖已显式设置其层级的当前版本,则软删除的 blob 的任何先前版本都将按完整内容长度进行计费。 有关如何结合使用 blob 版本控制和软删除的详细信息,请参阅 Blob 版本控制和软删除

功能支持

启用 Data Lake Storage Gen2、网络文件系统 (NFS) 3.0 协议或 SSH 文件传输协议 (SFTP) 可能会影响对此功能的支持。 如果已启用这些功能中的某一项,请参阅 Azure 存储帐户中的 Blob 存储功能支持,以评估对此功能的支持。

使用 Data Lake Storage Gen2 API 上传的 blob 不支持版本控制。

另请参阅