版本控制
版本控制用于实现在相同存储桶中存放同一对象的多个版本,例如:在一个存储桶中您可以存放多个对象键同为picture.jpg的对象,但其版本ID不同,例如:1000、1001和1002等,用户在为某一存储桶开启版本控制功能后,可以根据版本ID查询、删除或还原存放在存储桶中的对象,这有助于恢复被用户误删或应用程序故障而丢失的数据,例如:用户在对版本控制的对象进行删除操作时:
- 如果需要替换对象,对象存储会为新上传的对象插入新的版本ID,您仍然可以根据版本ID恢复被替换前的对象
- 如果需要删除对象(非完全删除),COS会为被删除的对象插入删除标记,该标记将作为当前对象版本,您可以根据删除标记恢复以前的版本
控制状态
存储桶可处于如下三种版本控制状态:
- 未启用版本控制状态:指存储桶的默认初始状态,此时版本控制功能关闭
- 启用版本控制状态:指开启版本控制功能,此时版本控制状态将应用到该存储桶中的所有对象,存储桶首次启用版本控制后新上传的对象将拥有唯一版本ID
- 暂停版本控制状态:指存储桶的版本控制由开启状态变更为暂停状态(无法返回未启用版本控制状态),此后往存储桶中上传的对象将不再存放版本控制的对象
对象管理
存储桶处于不同的版本控制状态下,您均可对不同状态的存储桶中的对象进行上传、查询和删除操作,除了未启用版本控制状态,启用版本控制状态和暂停版本控制状态下查询存储桶中的对象和删除对象的操作还包括不指定版本ID和指定版本ID
- 未启用版本控制状态下:上传、查询和删除对象等操作方式不变
- 启用和暂停版本控制状态下:上传、查询和删除对象等操作方式与以往方式的差别在于引入了版本ID,其中执行删除对象操作还有"删除标记"的概念
启用版本控制
启用存储桶版本控制前,已存储在存储桶中的对象,其版本ID为 null,启用版本控制后不会改变存储桶中已有的对象,只会改变COS处理已有对象的方式(如请求方式),此时新上传的同名对象将以不同的版本存在于同一个存储桶中,以下将介绍在已启用版本控制的存储桶中如何管理对象:
A、上传对象
对存储桶启用版本控制后,当用户执行PUT、POST或COPY操作时,COS会为存放到该存储桶中的对象自动添加唯一的版本ID,如下图所示,在启用了版本控制的存储桶中上传对象时,对象存储为该对象添加唯一的版本ID
B、版本信息
对象存储在与存储桶关联的versions参数中存储对象版本信息,COS按照存储时间的先后顺序返回对象版本,最先返回最近存储的版本,您可以通过versions参数和prefix 请求参数查询某对象的所有版本,查询某一对象的所有版本,请求示例如下:
https://cloud.tencent.com/document/product/436/35521
GET /?versions&prefix=ObjectKey HTTP/1.1
C、查询数据元版本
用户使用GET请求时无指定版本ID,将查询对象的当前版本,如下图所示,GET请求将返回123.txt对象的当前版本(最近版本):
如用户使用GET请求时指定其版本ID,将查询指定版本ID的对象,如下图所示,GET versionId请求查询指定版本(可以是当前版本)的对象
D、查询对象版本的元数据
如果您只需查询对象的元数据(而不是其内容),您可以使用HEAD操作,默认情况下您将获得最新版本的元数据,如要查询指定对象版本的元数据,则发送请求时需要指定其版本ID,查询指定版本的对象的元数据步骤如下
- 将versionId配置为被查询对象元数据的版本ID
- 发送指定versionId的HEAD操作请求
E、删除不必要的对象版本
您可以根据需要随时删除不必要的对象版本,用户在已启用版本控制状态下,使用DELETE请求有以下两个场景:
1、用户未指定版本ID,执行一般DELETE操作
此操作场景类似于将被删除对象放到了"回收站",但没有完全移除对象,后续用户如有需要仍然可以恢复数据,如下图所示,用户在DELETE操作时不指定版本ID,实际上不会删除Key=123.txt的对象,而是插入一个新的删除标记,并添加新的版本ID
2、用户指定版本ID,执行操作删除对象版本,此场景可以永久删除版本控制的对象
F、还原到较早期版本
版本控制能够用来还原对象的早期版本,有两种方法可执行该操作:
- 将对象早期版本复制到同一存储桶中:复制的对象将成为该对象的当前版本,且所有对象版本都保留
- 永久删除对象的当前版本:当您删除当前对象版本时,实际上会将前一个版本转换为该对象的当前版本
暂停版本控制
暂停版本控制时,存储桶中的现有对象不会更改,更改的是对象存储在以后的请求中处理对象的方式,以下将介绍在已暂停版本控制的存储桶中如何管理对象
A、上传对象
在存储桶上暂停版本控制后当用户执行PUT、POST或COPY操作时,COS自动将版本ID为null添加到存放到该存储桶中的对象,如下图所示
如果存储桶中存在版本控制的对象,则上传到存储桶的对象将成为当前版本,并且版本ID为 null,如下图所示:
如果存储桶中已存在空版本则该空版本将被覆盖,原有的对象内容也会相应被替换,如下图所示:
B、查询版本
在已暂停版本控制的存储桶上,用户发出GET Object请求将返回对象的当前版本
C、删除对象
如果暂停了版本控制,执行DELETE请求有以下情况:
1、存储桶中存在空版本的对象,将删除其版本ID为null的对象,如下图所示,用户执行一般DELETE操作时,COS会为空版本的对象插入删除标记
2、存储桶中没有空版本的对象,存储桶中会新添加一个删除标记,如下图所示,在存储桶不存在空版本的情况下,用户执行DELETE操作不会删除任何内容,对象存储仅插入删除标记
3、即使是在已暂停版本控制的存储桶中,主账号也可以永久删除指定版本,如下图所示,删除指定的对象版本将永久删除该对象
接口管理
您可以直接使用REST API配置存储桶的版本控制和管理版本控制状态下存储桶中的对象,请参见以下API文档:
https://cloud.tencent.com/document/product/436/19884
风险展示
开启版本控制
Step 1:进入COS管理台查看存储桶列表
Step 2:查看"容器容灾管理-版本控制"页面,确定开启版本控制
Step 3:查看文件列表,获取当前对象列表
Step 4:上传同名文件
Step 5:文件预览可以看到"Al2ex"
Step 6:查看历史版本可以看到上传的历史版本信息,此时可以还原、下载、查看详情等操作
未开启版本控制
Step 1:进入COS管理台查看存储桶列表
Step 2:查看"容器容灾管理-版本控制"页面,确定未开启版本控制
Step 3:查看文件列表,获取当前对象列表
Step 4:上传同名文件覆盖已有文件
成功实现文件覆盖:
文末小结
存储桶的版本控制是一个很不错的功能,当我们在错误的操作情况下将一些关键的对象文件删除后,我们可以通过查阅历史版本来恢复,同时可以规避文件覆盖的情况