You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

启用版本控制的Amazon S3桶中使用sync/cp命令无法恢复已删除文件的问题咨询

解决S3版本控制下文件同步后不可见的问题

咱们先理清楚问题根源:因为两个桶都开启了版本控制,你从存储桶A删除文件X的时候,根本没真正删掉文件实体,只是给X加了个「删除标记(Delete Marker)」——这个标记会被设为当前的“最新版本”,所以默认查看桶A时看不到X,只有开启「显示版本」才能看到这个删除标记和之前的文件版本。

当你从B同步回A时,虽然日志显示在复制,但S3的sync命令在处理带版本控制的桶时,默认不会自动替换当前的删除标记为文件实体,所以你还是看不到X。

下面给你两种简单的解决办法:

方法一:删掉桶A里X的删除标记

这是最直接的方式,把那个“挡住”文件的删除标记删掉,原来的文件版本就会自动成为最新版:

  1. 先列出桶A中X的所有版本,找到删除标记的版本ID:
    aws s3api list-object-versions --bucket A --prefix X
    
    看输出里IsLatesttrue的条目,它的VersionId就是删除标记的ID(这类条目会有DeleteMarker: true的标识)。
  2. 用这个ID删除删除标记:
    aws s3api delete-object --bucket A --key X --version-id <你找到的删除标记VersionId>
    
    执行完刷新桶A,就能正常看到X了。

方法二:强制复制文件覆盖当前状态

如果不想手动删标记,也可以直接从B复制X到A,强制创建新的最新版本:

aws s3 cp s3://B/X s3://A/X --metadata-directive REPLACE

这个--metadata-directive REPLACE参数会强制让新复制的文件版本成为桶A中X的最新版本,直接覆盖掉之前的删除标记,文件就能正常显示了。

另外,如果你发现桶A里还保留着X的原始版本(从「显示版本」里能看到),也可以直接从历史版本恢复:

  1. 先通过list-object-versions命令找到原始版本的ID(找DeleteMarker: false的条目)
  2. 执行复制命令把历史版本设为当前版本:
    aws s3api copy-object --source-bucket A --source-key X --source-version-id <原始版本ID> --destination-bucket A --destination-key X
    

内容的提问来源于stack exchange,提问作者Vikas Rathore

火山引擎 最新活动