Blob 版本控制

可以启用 Blob 存储版本控制来自动维护对象的先前版本。 当你启用 blob 版本控制时,可以访问 blob 的早期版本,以便在数据被修改或删除时恢复。

注意

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

Blob 版本控制的工作原理

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

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

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

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

显示 Blob 版本控制如何在写入操作中创建并提升版本的示意图。

重要

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

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

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

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

重要

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

版本标识

每个 blob 版本都有独特的版本 ID。 版本ID值是blob更新的时间戳。 你在创建版本时分配版本ID。

你可以通过使用版本ID读取或删除特定版本的blob。 如果你不包含版本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 版本控制时,所有对块 blob 的写入操作都会触发新版本的创建,除了 Put Block 操作。

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

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

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

删除操作时的版本控制

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

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

显示删除版本化 blob 的示意图。

若要删除 blob 的特定版本,请在删除操作中提供该版本的 ID。 如果你还为存储账户启用了 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版本控制时,在写入或删除操作中自动创建的。

重要

Azure 建议在启用 blob 版本控制后,还应更新应用程序以停止为块 blob 创建快照。 如果你为存储账户启用版本控制,它会通过使用版本捕获并保存所有块块的更新和删除。 如果启用了 Blob 版本控制,创建快照不会为块 Blob 数据提供任何额外保护,反而还可能增加成本和应用程序复杂性。

启用版本控制时为 blob 创建快照

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

当你为已启用版本控制的 Blob 创建快照时,也会同时创建一个新版本。 你在做快照时还会创建新的当前版本。

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

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

授予对 blob 版本的操作权限

您可以通过以下方法之一授权访问blob版本:

  • 使用 Azure 角色基础访问控制(Azure RBAC)来授予 Microsoft Entra 安全主体权限。 Azure建议使用Microsoft Entra ID,以提高安全性和易用性。 有关通过 Blob 操作使用 Microsoft Entra ID 的详细信息,请参阅授权访问 Azure 存储中的数据
  • 使用共享访问签名(SAS)委托对 Blob 版本的访问权限。 为签名资源类型 bv指定版本ID,表示blob版本,以创建针对特定版本操作的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时,当前新版本中的数据会与之前版本中存储的数据不同,你需要为每个块或页面的唯一数据付费。

当你在一个块块中替换一个方块时,你会为该方块作为唯一方块付费。 即使块的块ID和数据与上一个版本相同,这条规则依然适用。 再次提交该块后,它会与之前版本的对应块不同,你需要为其数据付费。 同样的规则也适用于页面大块中用相同数据更新的页面。

blob存储无法判断两个块是否包含相同的数据。 你上传并提交的每个区块都被视为唯一,即使它有相同的数据和区块ID。 由于你需要为唯一块付费,因此请注意,启用版本控制后更新 Blob 会导致产生更多唯一块,并带来额外费用。

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

以下场景展示了当你没有明确设置该块等级时,方块块及其版本的充能是如何累计的。

方案 1

在场景 1 中,blob 具有先前版本。 该 Blob 自版本创建以来一直未更新,因此你只需为唯一的第 1、2 和第 3 块付费。

图1显示了基础blob和之前版本中唯一区块的计费。

方案 2

在情景二中,你更新一个方块(图中的第3块)。 即使更新的块包含相同的数据和 ID,它也与先前版本中的块 3 不同。 因此,你得付四个街区的费用。

图2显示了基础blob和之前版本中唯一块的计费情况。

方案 3

在情景三中,你更新了blob,但不更新版本。 你在当前 blob 中将块 3 替换为块 4,但之前的版本仍显示为块 3。 因此,你得付四个街区的费用。

图3显示了基础blob和之前版本中唯一块的计费情况。

方案 4

在情景4中,你完全更新当前版本,且它不包含任何原始方块。 因此,你需要为全部八个独特方块付费——当前版本中有四个,前两个版本中合并四个。 如果你用 Put 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 API 上传的 blobs 不支持版本控制。

另请参阅