删除DeleteMarker

更新时间:
复制为 MD 格式

DeleteMarker 是对象存储 OSS 版本控制功能中的删除标记对象。在启用版本控制的存储空间(Bucket)中删除对象时,OSS 会插入一个 DeleteMarker 作为对象的当前版本,原对象的所有历史版本仍被保留。删除 DeleteMarker 将使对象恢复为可访问状态,最新的非删除标记版本将成为对象的当前版本。

全量删除所有DeleteMarker

若您需要清理Bucket中的所有DeleteMarker,请参考如下步骤。

步骤1:执行全量恢复

# 恢复整个Bucket中所有被DeleteMarker隐藏的对象
ossutil revert oss://dest-bucket/ HEAD~0 -r -f

参数说明:

  • HEAD~0:恢复到最近的有效版本(如果最新版本是DeleteMarker,则删除DeleteMarker进行恢复)

  • -r:递归处理整个Bucket下的所有对象

  • -f:强制执行,不提示确认

返回结果示例:

Success: Total 100 objects, Revert done:(100 objects)

0. xxx(s) elapsed

步骤2:验证删除结果

# 确认DeleteMarker已全部删除
ossutil ls oss://dest-bucket/ --all-versions -r | grep "true.*true" | wc -l
# 应输出 0

# 查看恢复的对象数量
ossutil ls oss://dest-bucket/ -r | grep "Object Number"

按列表精准删除DeleteMarker

目标Bucket有多种删除来源,需要精准删除指定DeleteMarker。适合Bucket中既有复制产生的DeleteMarker,也有手动删除产生的DeleteMarker的情况。

步骤1:安装ossutil 2.2.1-beta

# 下载对应平台的版本(根据实际情况选择其中一个)
# Linux AMD64:
wget https://gosspublic.alicdn.com/ossutil/v2-beta/2.2.1-beta.12121200/ossutil-2.2.1-beta.12121200-linux-amd64.zip
# Linux ARM64:
# wget https://gosspublic.alicdn.com/ossutil/v2-beta/2.2.1-beta.12121200/ossutil-2.2.1-beta.12121200-linux-arm64.zip
# macOS ARM64(M1/M2/M3芯片):
# wget https://gosspublic.alicdn.com/ossutil/v2-beta/2.2.1-beta.12121200/ossutil-2.2.1-beta.12121200-mac-arm64.zip
# macOS AMD64(Intel芯片):
# wget https://gosspublic.alicdn.com/ossutil/v2-beta/2.2.1-beta.12121200/ossutil-2.2.1-beta.12121200-mac-amd64.zip

# 解压(根据下载的文件名修改)
unzip ossutil-2.2.1-beta.12121200-linux-amd64.zip

# 进入解压后的目录(根据下载的文件名修改)
cd ossutil-2.2.1-beta.12121200-linux-amd64

# 授权
chmod +x ossutil

# 验证版本
./ossutil version
# 输出应为:2.2.1-beta.12121200

# 配置访问凭证
./ossutil config
# 根据提示依次输入:
# 1. Config file name: 直接回车使用默认路径
# 2. Access Key ID: 您的AccessKey ID
# 3. Access Key Secret: 您的AccessKey Secret  
# 4. Region: 例如 cn-beijing 或 cn-hangzhou
# 5. Endpoint: 直接回车使用默认公网Endpoint

步骤2:准备DeleteMarker列表文件

创建文件 deletemarker_list.txt,每行一个需要恢复的对象路径:

data/report-2024-12.xlsx
images/product/banner.jpg
backup/database/
logs/2024/12/app.log

列表格式说明:

  • 每行一个对象路径,相对于Bucket根目录

  • 不包含 oss://bucket-name/ 前缀

  • 目录对象以 / 结尾

步骤3:执行恢复操作

列表文件deletemarker_list.txt中包含目录对象(以 / 结尾),ossutil命令中必须添加参数--support-dir-object

第一步:查看列表中有哪些对象在OSS中已存在

./ossutil ls oss://dest-bucket/ -r --files-from deletemarker_list.txt --support-dir-object

第二步:恢复删除的对象

./ossutil revert oss://dest-bucket/ HEAD~0 -f -r --files-from deletemarker_list.txt --support-dir-object

第三步:验证恢复结果

再次执行第一步命令,对比文件个数是否与 deletemarker_list.txt 中的记录完全一致:

./ossutil ls oss://dest-bucket/ -r --files-from deletemarker_list.txt --support-dir-object | grep "Object Number is:" | cut -d":" -f2
wc -l deletemarker_list.txt

两个数字一致则代表全部恢复成功。

可选:后台执行命令(避免网络中断)

如果对象数量较多,可以后台执行:

# 1. 创建脚本文件
cat > revert.sh << 'EOF'
#!/bin/bash
./ossutil revert oss://dest-bucket/ HEAD~0 -f -r --files-from deletemarker_list.txt --support-dir-object
EOF

# 2. 授权为可执行文件
chmod +x revert.sh

# 3. 后台执行命令
nohup ./revert.sh &

# 4. 查看执行进度(输出保存在 nohup.out 文件中)
tail -f nohup.out