版本控制概述

最近更新时间:2019-08-20 17:37:20

简介

版本控制用于实现在相同存储桶中存放同一对象的多个版本。例如,在一个存储桶中,您可以存放多个对象键同为 picture.jpg 的对象,但其版本 ID 不同,例如100000、100101和120002等。用户在为某一存储桶开启版本控制功能后,可以根据版本 ID 查询、删除或还原存放在存储桶中的对象。这有助于恢复被用户误删或应用程序故障而丢失的数据。例如,用户在对版本控制的对象进行删除操作时:

  • 如果需要删除对象 (非完全删除),COS 会为被删除的对象插入删除标记,该标记将作为当前对象版本,您可以根据删除标记恢复以前的版本。
  • 如果需要替换对象,对象存储会为新上传的对象插入新的版本 ID,您仍然可以根据版本 ID 恢复被替换前的对象。

版本控制状态

存储桶可处于三种版本控制状态:未启用版本控制状态、启用版本控制状态和暂停版本控制状态。

  • 未启用版本控制状态:指存储桶的默认初始状态,此时版本控制功能关闭。
  • 启用版本控制状态:指开启存储桶版本控制功能,此时为版本控制开启状态,版本控制状态将应用到该存储桶中的所有对象。您对存储桶首次启用版本控制后,该存储桶中新上传的对象将拥有唯一的版本 ID。
  • 暂停版本控制状态:指存储桶的版本控制由开启状态变为暂停状态(无法返回未启用版本控制状态),此后往存储桶中上传的对象将不再存放版本控制的对象。
注意:

  1. 一旦您对存储桶启用了版本控制,它将无法返回到未启用版本控制状态(初始状态)。但是,您可以对该存储桶暂停版本控制,这样后续新上传的对象将不会产生多个版本。
  2. 在启用版本控制之前,存储在存储桶中的对象的版本 ID 均为 null。
  3. 启用或暂停版本控制时,会改变对象存储在处理这些对象的请求方式,不会改变对象本身。
  4. 只有主账号和授权子账号可以暂停存储桶的版本控制。

管理版本控制状态下的对象

存储桶处于不同的版本控制状态下,您均可对不同状态的存储桶中的对象进行上传、查询和删除操作。除了未启用版本控制状态,启用版本控制状态和暂停版本控制状态下,查询存储桶中的对象和删除对象的操作还包括不指定版本 ID 和指定版本 ID。

  • 未启用版本控制状态下:上传、查询和删除对象等操作方式不变,详情请参见 对象管理 目录下的文档。
  • 启用和暂停版本控制状态下:上传、查询和删除对象等操作方式,与以往方式的差别在于引入了版本 ID。其中执行删除对象操作还有“删除标记”的概念。

管理启用版本控制状态下的对象

启用存储桶版本控制前,已存储在存储桶中的对象,其版本 ID 为 null。启用版本控制后,不会改变存储桶中已有的对象,只会改变 COS 处理对已有对象的方式(如请求方式)。此时,新增加的同名对象将以不同的版本存在于同一个存储桶中。以下将介绍在已启用版本控制的存储桶中如何管理对象:

注意:

用户在未启用版本控制和启用版本控制的存储桶中上传对象的方式都是相同的,但其版本 ID 不同。通过第二种方式,对象存储会为对象分配特定版本 ID,而前一种方式上传的对象,其版本 ID 始终为 null。

上传对象

对存储桶启用版本控制后,当用户执行 PUT、POST 或 COPY 操作时,COS 会为存放到该存储桶中的对象自动添加唯一的版本 ID。
如下图所示,在启用了版本控制的存储桶中上传对象时,对象存储为该对象添加唯一的版本 ID。

列出版本控制对象

对象存储在与存储桶关联的 versions 参数中存储对象版本信息。COS 按照存储时间的先后顺序返回对象版本,最先返回最近存储的版本。

查询特定对象的所有版本

您可以通过以下过程,使用 versions 参数和 prefix 请求参数查询某对象的所有版本。有关 prefix 的更多信息,请参见 GET Bucket Object Versions 文档。
查询某一对象的所有版本,请求示例如下:

GET /?versions&prefix=OjectKey HTTP/1.1

查询数据元版本

用户使用 GET 请求时无指定版本 ID,将查询对象的当前版本。如下图所示,GET 请求将返回 123.txt 对象的当前版本(最近版本)。

如用户使用 GET 请求时指定其版本 ID,将查询指定版本 ID 的对象。如下图所示,GET versionId 请求查询指定版本(可以是当前版本)的对象。

查询对象版本的元数据

如果您只需查询对象的元数据(而不是其内容),您可以使用 HEAD 操作。默认情况下,您将获得最新版本的元数据。如要查询指定对象版本的元数据,则发送请求时需要指定其版本 ID。
查询指定版本的对象的元数据步骤如下:

  • 将 versionId 配置为被查询对象元数据的版本 ID。
  • 发送指定 versionId 的 HEAD 操作请求。

删除对象

您可以根据需要,随时删除不必要的对象版本。用户在已启用版本控制状态下,使用 DELETE 请求有以下两个场景:

  1. 用户未指定版本 ID,执行一般 DELETE 操作。
    此操作场景类似于将被删除对象放到了“回收站”,但没有完全移除对象,后续用户如有需要仍然可以恢复数据。
    如下图所示,用户在 DELETE 操作时不指定版本 ID,实际上不会删除 Key=123.txt 的对象,而是插入一个新的删除标记,并添加新的版本 ID。

    注意:

    COS 将在存储桶中为被删除对象插入一个拥有新版本 ID 的删除标记,该删除标记将成为被删除对象的当前版本。当您尝试对该删除标记的对象执行 GET 操作时,对象存储会认为该对象不存在,并返回404错误。

  2. 用户指定版本 ID,执行操作删除对象版本,此场景可以永久删除版本控制的对象。

删除标记

删除标记用于版本控制的对象,删除标记在 COS 中可认为是“对象已被删除”的标记。删除标记与对象同样拥有对象键(Key)和版本 ID。区别在于以下几点:

  • 删除标记的内容为空。
  • 删除标记不存在 ACL 值。
  • 删除标记执行 GET 请求会返回404错误,响应标头x-cos-delete-marker: true
  • 删除标记只支持 DELETE 操作(需要主账号下发出请求)。

删除“删除标记”

用户如需删除“删除标记”,则可以在 DELETE Object versionId 请求中指定它的版本 ID,实现永久删除“删除标记”。如果您未指定删除标记的版本 ID,对删除标记发出 DELETE 请求,COS 将不会删除该删除标记,而是再插入一个新的删除标记。
如下图所示,对删除标记执行一般 DELETE 请求,不会删除任何内容,而在存储桶里新增了一个新的删除标记。

在已启用版本控制的存储桶中,新增的删除标记将具有唯一的版本 ID。因此,在一个存储桶中,同一个对象可能有多个删除标记。要永久删除“删除标记”,必须在 DELETE Object versionId 请求中包含其版本 ID。
如下图所示,执行 DELETE Object versionId 请求永久删除“删除标记”。

注意:

只有主账号可以永久删除“删除标记”。

永久删除“删除标记”的步骤:

  1. 设置 versionId 为删除标记的版本 ID。
  2. 发送 DELETE Object versionId 请求。

还原早期版本

版本控制能够用来还原对象的早期版本,有两种方法可执行该操作:

  1. 将对象的早期版本复制到同一存储桶中
    复制的对象将成为该对象的当前版本,且所有对象版本都保留。
  2. 永久删除对象的当前版本
    当您删除当前对象版本时,实际上会将前一个版本转换为该对象的当前版本。

管理暂停版本控制状态下的对象

暂停版本控制时,存储桶中的现有对象不会更改。更改的是对象存储在以后的请求中处理对象的方式。以下将介绍在已暂停版本控制的存储桶中如何管理对象。

上传对象

在存储桶上暂停版本控制后,当用户执行 PUT、POST 或 COPY 操作时,COS 自动将版本 ID 为 null 添加到存放到该存储桶中的对象。如下图所示:

如果存储桶中存在版本控制的对象,则上传到存储桶的对象将成为当前版本,并且版本 ID 为 null。如下图所示:

如果存储桶中已存在空版本,则该空版本将被覆盖,原有的对象内容也会相应被替换,如下图所示:

查询数据元版本

在已暂停版本控制的存储桶上,用户发出 GET Object 请求将返回对象的当前版本。

删除对象

如果暂停了版本控制,执行 DELETE 请求有以下情况:

  • 存储桶中存在空版本的对象,将删除其版本 ID 为 null 的对象。
    如下图所示,用户执行一般 DELETE 操作时,COS 会为空版本的对象插入删除标记。

    注意:

    删除标记不存在内容,在删除标记替换空版本时,空版本原先的内容会丢失。

  • 存储桶中没有空版本的对象,存储桶中会新添加一个删除标记。
    如下图所示,在存储桶不存在空版本的情况下,用户执行 DELETE 操作不会删除任何内容,对象存储仅插入删除标记。

  • 即使是在已暂停版本控制的存储桶中,主账号也可以永久删除指定版本。
    如下图所示,删除指定的对象版本将永久删除该对象。

注意:

只有主账号可以删除指定的对象版本。