对象版本控制

设置 用法

对象版本控制会将已删除的对象保留为有版本控制的非当前对象,这些对象在明确移除之前仍可在存储桶中访问。此功能用于跟踪对象的更改以及实现对象特定版本的恢复。本页面介绍了此功能以及使用此功能时可用的选项。

我们建议您使用软删除而不是对象版本控制来防止意外或恶意删除导致数据永久丢失。如需详细了解何时使用软删除和对象版本控制,请参阅注意事项

简介

您可为存储桶启用对象版本控制。启用之后:

  • 您每次替换或删除有效对象版本时,只要您不指定该有效版本的世代编号,Cloud Storage 都会保留非当前对象版本。

    • 非当前版本会保留对象的名称,但由其世代编号唯一标识。

    • 非当前版本只会出现在明确要求包含它们的请求中。

  • 您可以通过在删除请求中添加世代编号或使用对象生命周期管理来删除对象的非当前版本。

  • 在启用了软删除的存储桶中,您无法在软删除保留时长结束之前永久删除非当前对象。删除非当前对象时,Cloud Storage 会将其状态更改为已软删除。软删除的对象会在软删除保留期限到期后被永久删除。

  • 对象的非当前版本独立于任何当前版本。

如果您停用对象版本控制

  • 存储桶不再累积对象的新非当前版本。

  • 存储桶中已存在的对象版本不受影响。

注意事项

  • 无法在当前具有保留策略的存储桶上启用对象版本控制。
  • 默认情况下,您可以拥有的对象版本数不受限制。对象的每个非当前版本都将按当前版本的费率收费

  • 提前删除费用仅适用于从存储桶中移除对象版本的情况,而不适用于其变为非当前版本时。从存储桶中移除版本的存储期限取决于添加到存储桶的时间,而非转变为非当前版本的时间。

  • 如果启用版本控制,请考虑使用对象生命周期管理,此功能可以在指定时间长度后移除对象的旧版本,或者在较新版本变为非当前版本时移除对象的旧版本。如需查看一种可能的设置,请参阅用于删除对象的生命周期配置示例。

  • 如需确定为存储桶启用对象版本控制还是软删除,请考虑以下几点:

    • 如果您希望防止意外或恶意删除导致数据永久丢失,请使用软删除,而不是对象版本控制。软删除通过保留最近删除的所有现行对象或非当前对象来提供存储桶级保护。软删除还可以防止存储桶级删除。
    • 如果您有特定的结算要求,并且已使用前缀来配置对象生命周期管理规则以保留指定数量的非当前版本,请使用对象版本控制。

      在这种情况下,您只能部分防止意外删除,因为对象版本控制无法防止存储桶级事件或非当前对象意外删除。

    • 非当前对象可访问且可读,而软删除的对象则离线保留且不可读。恢复软删除的对象需要 Storage Admin (roles/storage.admin) IAM 角色提供的特定 IAM 权限

      如果您希望访问最近删除的对象,并且需要高级别保护,防止因意外和恶意删除事件而导致数据永久丢失,则可以为同一存储桶同时启用对象版本控制和软删除。您可以将对象生命周期管理政策配置为在特定天数后自动删除非当前版本,然后使用软删除提供额外一层保护。

非当前对象元数据

对象的非当前版本具有自己的元数据(可能与当前版本的元数据不同)。最重要的是,非当前版本会保留自己的 ACL,并且不一定与当前版本具有相同的权限。

每个版本(无论是当前版本还是非当前版本)都有一组元数据;只有最新的元数据世代编号才用于指代元数据。较旧的元数据世代编号不能用于访问更改后的元数据。

如需更新对象的非当前版本的元数据,您可以在请求中指定该对象的 generation。要确保实现安全的读取-修改-写入语义,您可以使用 metageneration-match 先决条件。如果您尝试更新的元数据在您读取元数据之后、发送更新之前发生更改,则使用此先决条件会导致更新失败。

对象版本控制示例

以下示例展示了在文件 cat.jpg 位于启用了对象版本控制和软删除的存储桶的情况下,当您替换、更新和删除该文件时会发生的情况。

您上传了一张新图片

当您首次cat.jpg 上传到 Cloud Storage 时,它会收到一个 generation 编号和一个 metageneration 编号。在此示例中,世代编号为 1360887697105000。由于该对象是一个新对象,因此 metageneration 编号是 1

即使未启用对象版本控制,cat.jpg 也会收到 generationmetageneration 编号。您可以查看对象元数据以获取这些数量。

您启用了对象版本控制

此时,您决定为存储桶启用对象版本控制。这样做不会影响 cat.jpggenerationmetageneration 编号。

您更改了图片的元数据

您通过添加自定义元数据更新 cat.jpg 的元数据:color:black。更新元数据会导致 cat.jpgmetageneration 值增加,在本例中,该值从 1 增加到 2。但是,对象本身保持不变,因此 Cloud Storage 仍会仅存储 cat.jpg 的一个版本,并且该版本的 generation 编号仍然为 1360887697105000

您上传了图片的一个新版本

您将 cat.jpg 的一个新版本上传到 Cloud Storage 存储桶中。执行此操作时,对象版本控制会将现有 cat.jpg 对象更改为非当前版本状态。非当前版本保留了与之前相同的存储类别和元数据。仅当您执行启用了版本控制的列出操作时,系统才会显示非当前版本:非当前版本不会出现在正常的列出命令中。非当前版本现在的引用名称为 cat.jpg#1360887697105000

同时,新上传的 cat.jpg 将成为对象的当前版本。这个新的 cat.jpg 将获得自己的 generation 编号(在此示例中为 1360887759327000)。它还会获得自己的元数据和 metageneration 编号 (1),这意味着它不包含 color:black 元数据(除非您指定该元数据)。当您访问或修改 cat.jpg, 时,将使用此版本。您也可以使用 generation 编号来指代此版本的 cat.jpg。例如,在使用 Google Cloud CLI 时,您将使用 cat.jpg#1360887759327000 指代此版本。

您删除了图片的当前版本

您现在要删除 cat.jpg。当您执行此操作时,世代编号为 1360887759327000 的版本会变为非当前版本。您的存储桶现在包含 cat.jpg 的两个非当前版本,不包含任何当前版本。您仍然可以使用 generation 编号来指代任意一个非当前版本,但如果您尝试在没有 generation 编号的情况下访问 cat.jpg,此操作将失败。

同样地,存储桶的正常对象列出操作不会将 cat.jpg 显示为存储桶中的一个对象。如需了解如何列出对象的非当前版本,请参阅列出非当前对象版本

您停用了对象版本控制

停用了对象版本控制,这会阻止对象变为非当前版本。对象现有的非当前版本将保留在 Cloud Storage 中。即使对象版本控制被停用,cat.jpg#1360887697105000cat.jpg#1360887759327000 仍会存储在您的存储桶中,直到您将其删除。

您恢复了其中一个非当前版本

即使对象版本控制被停用,您仍可以为其中一个现有的非当前版本创建副本,从而有效地恢复版本。执行此操作后,您的存储桶将拥有 cat.jpg 的三个版本:两个非当前版本,以及一个因恢复创建的当前版本。

删除一个非当前版本

您可以通过手动方式或使用对象生命周期管理来删除对象的非当前版本。

删除非当前版本 cat.jpg#1360887697105000 后,该版本会被软删除。该软删除的对象会保留存储桶的软删除政策中指定的软删除保留时长。保留时长到期后,Cloud Storage 会永久删除此对象的软删除版本。

恢复一个软删除的对象版本

即使对象版本控制被停用,您也可以恢复非当前对象的软删除版本。软删除版本的副本会恢复为具有新的对象元数据和新的创建日期的现行版本。原始软删除的对象也会保留在存储桶中,并在软删除保留时长到期后被永久删除。

对象版本控制参考文档

此参考表格显示了使用对象版本控制执行某些操作时发生的情况。

对象版本控制状态 软删除状态 操作 结果
已停用 已停用
删除 dog.png dog.png 会被永久删除。
通过指定 dog.png 的世代编号来删除其非当前版本。1 非当前版本会被永久删除。
dog.png 替换为新版本。 新版本会替换现行版本并接收新的世代编号。系统会永久删除旧的现行版本。
复制 dog.png 的非当前版本以覆盖现行版本。1 非当前版本的副本会替换现行版本并接收新的世代编号。系统会永久删除旧的现行版本。
已停用 已启用
删除 dog.png dog.png 会被软删除。
通过指定 dog.png 的世代编号来删除其非当前版本。1 非当前版本会被软删除。
dog.png 替换为新版本。 新版本会替换现行版本并接收新的世代编号。旧的现行版本会被软删除。
复制 dog.png 的非当前版本以覆盖现行版本。1 非当前版本的副本会替换现行版本并接收新的世代编号。旧的现行版本会被软删除。
已启用 已停用
在不指定 dog.png 世代编号的情况下删除其现行版本。 该现行版本会变为非当前版本,并保留相同的世代编号。
通过指定 dog.png 世代编号来删除其现行版本。 现行版本会被永久删除。
通过指定 dog.png 的世代编号来删除其非当前版本。 非当前版本会被永久删除。
dog.png 替换为新版本。 新版本会替换现行版本并接收新的世代编号。旧的现行版本会变为非当前版本,并保留相同的世代编号。
复制 dog.png 的非当前版本以覆盖现行版本。 非当前版本的副本会替换现行版本并接收新的世代编号。旧的现行版本会变为非当前版本,并保留相同的世代编号。
已启用 已启用
在不指定 dog.png 世代编号的情况下删除其现行版本。 该现行版本会变为非当前版本,并保留相同的世代编号。
通过指定 dog.png 世代编号来删除其现行版本。 现行版本会被软删除。
通过指定 dog.png 的世代编号来删除其非当前版本。 非当前版本会被软删除。
dog.png 替换为新版本。 新版本会替换现行版本并接收新的世代编号。旧的现行版本会变为非当前版本,并保留相同的世代编号。
复制 dog.png 的非当前版本以覆盖现行版本。 非当前版本的副本会替换现行版本并接收新的世代编号。旧的现行版本会变为非当前版本,并保留相同的世代编号。

1 如果存储桶之前启用了对象版本控制,则可能存在非当前版本。

文件恢复行为

您可以有效地将非当前对象版本恢复到当前当前版本。如需执行此操作的分步指南,请参阅恢复非当前对象版本

如果您在启用对象版本控制的情况下执行此操作,那么,当存储桶中已存在对象的有效版本时,Cloud Storage 会替换现有的有效版本,但也会将其保留为新的非当前版本。在这种情况下,您的存储桶随后会包含被替换的对象(现为非当前版本)以及该对象先前为非当前版本的两个副本(一个当前副本和一个仍为非当前版本的副本),这些内容都会产生存储费用。如需防止产生不必要的费用,请删除用于创建当前副本的非当前版本,或配置对象生命周期管理以在满足您指定的条件时移除非当前对象。

后续步骤