开启了多版本控制后,如果由于意外操作或应用程序故障导致数据丢失,可以通过以下方法找回丢失的数据:
- 通过复制指定版本的对象,来使得任意历史版本的对象成为当前版本对象。
- 通过彻底删除带删除标记的当前版本,来使得最近一个历史版本对象成为当前版本对象。
前提条件
- 对象所在桶已开启多版本控制。
- 通过彻底删除带删除标记的对象来找回对象时,要求至少有一个不带删除标记的历史版本对象存在。
通过复制指定版本对象来找回对象
OBS支持通过API、SDK方式在复制对象时指定对象的版本号来复制指定版本对象,不支持通过管理控制台、OBS Browser+、obsutil方式复制指定版本对象。
复制前,请先根据查看多版本对象(开启或暂停多版本状态下)查询到需要复制的版本对象的版本ID。
通过彻底删除带删除标记的当前版本来找回对象
桶开启多版本控制后删除对象时,对象不会被真正删除,OBS会插入一个删除标记来标识对象的最新版本是删除状态,之前的当前版本对象变为历史版本对象。可以通过彻底删除带删除标记的对象来找回对象。
OBS支持通过管理控制台、API、SDK、obsutil方式删除带删除标记的当前版本来找回对象,不支持通过OBS Browser+方式删除带删除标记的当前版本来找回已删除对象。
使用OBS控制台
- 在OBS管理控制台左侧导航栏选择“桶列表”。
- 在桶列表中,单击待操作的桶,进入“对象”页面。
- 打开对象列表上方的“历史版本”开关。
- 在“最后修改时间”列找到带“删除标记”的对象,单击其操作列的“彻底删除”。
也可以选中所有带“删除标记”的对象,单击对象列表上方的“彻底删除”来批量找回对象。
图1 找回单个对象
图2 批量找回对象
- 在“彻底删除对象”弹窗,单击“确定”。
可以看到“删除标记”消失,且最近的一个历史版本对象成为当前版本对象,即找回对象。
使用API
- 通过列举桶内对象查询带删除标记对象的版本ID:响应体中带“DeleteMarker”参数的对象即为删除标记,其对应的“VersionId”参数值即为删除标记的版本ID。
- 删除对象:待删除对象的版本ID“versionId”为1查询到的带删除标记对象的版本ID。
使用SDK
- 通过列举多版本对象,查询带删除标记对象的版本ID:响应体中带“DeleteMarker”参数的对象即为删除标记,其对应的“VersionId”参数值即为删除标记的版本ID。列举多版本对象的SDK如下:
- 删除对象:待删除对象的版本ID“versionId”为1查询到的带删除标记对象的版本ID。删除对象SDK如下:
使用命令行工具obsutil
- 通过列举对象查询带删除标记对象的版本ID:响应结果中“DeleteMarker list”列表下的“VersionId”即为删除标记的版本ID。
- 删除对象:待删除对象的版本ID“versionId”为1查询到的带删除标记对象的版本ID。删除对象命令如下:
命令结构:
- Windows操作系统
obsutil rm obs://bucket/key [-f] -versionId=xxx [-fr] [-o=xxx] [-config=xxx] [-e=xxx] [-i=xxx] [-k=xxx] [-t=xxx]
- macOS/Linux操作系统
./obsutil rm obs://bucket/key [-f] -versionId=xxx [-fr] [-o=xxx] [-config=xxx] [-e=xxx] [-i=xxx] [-k=xxx] [-t=xxx]
运行示例:
以Windows操作系统为例,运行
obsutil rm obs://test-bucket/data_0001.txt -versionId=G001119ED32CD9F700004011024A1A22,删除bucket-test桶中名为
data_0001.txt对象的删除标记。“
G001119ED32CD9F700004011024A1A22”为删除标记的版本ID。
obsutil ls obs://test-bucket/data_0001.txt -v
Start at 2026-06-17 01:23:35.2387286 +0000 UTC
Listing versioning objects .
Versioning Object list:
Key VersionId LastModified Size StorageClass ETag
obs://test-bucket/data_0001.txt
G001119ED0A0BF6800004017005E42D5 2026-06-16T13:30:56Z 0B standard "d41d8cd98f00b204e9800998ecf8427e"
DeleteMarker list:
Key VersionId LastModified StorageClass
obs://test-bucket/data_0001.txt
G001119ED32CD9F700004011024A1A22 2026-06-17T01:23:12Z standard
Total size of prefix [data_0001.txt]: 0B
Folder number: 0
Versioning file number: 1
DeleteMarker number: 1
obsutil rm obs://test-bucket/data_0001.txt -versionId=G001119ED32CD9F700004011024A1A22
Start at 2026-06-17 01:23:56.7597831 +0000 UTC
Do you want delete object [data_0001.txt] in the bucket [test-bucket]? Please input (y/n) to confirm:
y
Delete object [data_0001.txt] with version id [G001119ED32CD9F700004011024A1A22] in the bucket [test-bucket] successfully, cost [187], request id [0000019ED32D911E4015141E86F59409]
obsutil ls obs://test-bucket/data_0001.txt -v
Start at 2026-06-17 01:24:03.869759 +0000 UTC
Listing versioning objects .
Versioning Object list:
Key VersionId LastModified Size StorageClass ETag
obs://test-bucket/data_0001.txt
G001119ED0A0BF6800004017005E42D5 2026-06-16T13:30:56Z 0B standard "d41d8cd98f00b204e9800998ecf8427e"
Total size of prefix [data_0001.txt]: 0B
Folder number: 0
Versioning file number: 1
DeleteMarker number: 0 参数说明:
| 参数 | 约束 | 描述 |
| bucket | 必选 | 桶名。 |
| key | 删除单个对象时必选 批量删除对象时可选 | 待删除的对象名,或批量删除的对象名前缀。 说明: 批量删除对象时,如果该参数为空,则表示删除桶中所有的对象。请谨慎操作。 |
| fr | 附加参数,删除单个对象时可选 | 删除单个对象时生成结果清单文件。 |
| f | 附加参数,可选 | 强制操作,不进行询问提示。请谨慎使用。 |
| versionId | 附加参数,删除单个对象时可选 删除多版本对象时必选。 | 待删除对象的版本号。 |
| r | 附加参数,批量删除对象时必选 | 按指定的对象名前缀批量删除对象。 注意: 批量删除对象时,会将与前缀匹配的所有对象删除,请谨慎使用。 |
| j | 附加参数,批量删除对象时可选 | 批量删除对象时的最大并发数,默认为配置文件中的defaultJobs。 |
| v | 附加参数,批量删除对象时可选 | 按指定的对象名前缀批量删除多版本对象和多版本删除标记。 |
| o | 附加参数,可选 | 生成结果清单文件的文件夹,命令执行完成后,会在该文件夹下生成结果清单文件(可能包含成功结果和失败结果两个文件),默认为运行obsutil命令的用户目录的子文件夹.obsutil_output。 说明: - 结果清单文件命名规则:rm_{succeed | failed}_report_时间_TaskId.txt。
- 单个结果清单文件默认情况下最大为30MB且最大可保留的文件个数为1024,可在配置文件中通过recordMaxLogSize和recordBackups分别配置。
- 当涉及多文件/文件夹时,如需确认失败任务的具体错误信息,可参考结果清单文件夹下的失败结果清单文件“cp_failed_report_时间_TaskId.txt”和日志路径下的日志文件。
|
| bucket-cname | 附加参数,可选 | 指定桶绑定的自定义域名 |
| config | 附加参数,可选 | 运行当前命令时的自定义配置文件。可支持的配置参数请参考配置参数说明。 |
| e | 附加参数,可选 | 指定终端节点。 |
| i | 附加参数,可选 | 指定用户的AK。 |
| k | 附加参数,可选 | 指定用户的SK。 |
| t | 附加参数,可选 | 指定用户的securitytoken。 |
响应结果:
| 字段名 | 描述 |
| Parallel | 请求中的-p参数。 |
| Jobs | 请求中的-j参数。 |
| Threshold | 请求中的-threshold参数。 |
| PartSize | 请求中的-ps参数。 |
| Exclude | 请求中的-exclude参数。 |
| Include | 请求中的-include参数。 |
| TimeRange | 请求中的-timeRange参数。 |
| VerifyLength | 请求中的-vlength参数。 |
| VerifyMd5 | 请求中的-vmd5参数。 |
| CheckpointDir | 请求中的-cpd参数。 |
| OutputDir | 请求中的-o参数。 |
| ArcDir | 请求中的-arcDir参数。 |
| Succeed count | 成功的任务数。 |
| Failed count | 失败的任务数。 |
| Skip count | 增量上传/下载/复制、同步上传/下载/复制跳过的任务数。 |
| Warning count | 执行完成但包含警告的任务数。 说明: - 产生警告的任务可能是失败的也可能是成功的,需要根据成功或失败的结果清单进一步判断。
- 产生警告的任务数与成功/失败任务数是相互独立的,总任务数仍是成功的任务数+失败的任务数。
|
| Succeed bytes | 上传/下载成功的字节数。 |
| max cost | 所有任务中的最长耗时,单位:毫秒。 |
| min cost | 所有任务中的最短耗时,单位:毫秒。 |
| average cost | 平均耗时,单位:毫秒。 |
| average tps | 平均每秒的任务完成个数。 |
| Task id | 每次运行的唯一标识号,用于查找批量任务生成的结果清单文件。 |