版本与删除标记
开启版本控制后,同名对象的每次写入都保留为独立版本,键本身则指向「当前版本」。删除操作不再真的抹掉数据,而是插入一个删除标记:键的读取会返回对象不存在,历史版本依然完整保留,去掉删除标记就能恢复。这套机制把误删变成可回滚操作,代价是容量与清理逻辑都要按版本口径重新设计。
基本信息
| 适用平台 | 兼容 S3 的对象存储,需桶级开启 |
|---|---|
| 三种状态 | 未启用、已启用、已暂停 |
| 删除语义 | 无版本号删除为插入标记,带版本号删除为永久删除 |
| 观察方式 | 普通列举与版本列举返回的内容不同 |
典型使用场景
- 防误删:生产数据被误覆盖或误删后可回退到旧版本
- 合规留存:历史版本按法规要求保留一定期限
- 灰度发布:保留多个版本以便快速回滚到上一版
- 调试与审计:追溯某个对象在什么时间被谁改成了什么
- 配合对象锁定:保留策略需要版本作为挂载对象
关键操作
关键操作
aws s3api put-bucket-versioning --bucket demo-bucket \
--versioning-configuration Status=Enabled # 开启版本控制
aws s3api list-object-versions --bucket demo-bucket --prefix data.json # 查看全部历史版本
aws s3api delete-object --bucket demo-bucket --key data.json # 插入删除标记
aws s3api delete-object --bucket demo-bucket --key data.json --version-id <版本号> # 永久删除该版本
aws s3api list-objects-v2 --bucket demo-bucket # 普通列举:带标记的键不再出现状态与行为
| 状态 | 写入行为 | 删除行为 |
|---|---|---|
| 未启用 | 同名覆盖,旧内容丢失 | 直接删除,无法恢复 |
| 已启用 | 每次覆盖生成新版本 | 插入删除标记,可撤回 |
| 已暂停 | 新版本使用空版本号覆盖同一份 | 已有历史版本仍然保留 |
运维要点
- 开启后容量会随版本增长,必须配非当前版本的清理规则
- 删除标记本身也占用一条记录,长期不清理会让列举变长变慢
- 恢复误删对象是删除删除标记,而不是重新上传
- 暂停版本控制不会清除历史版本,但会让新写入失去版本保护
- 区分「带版本号永久删除」与普通删除,前者无法回滚,需要额外防护
普通列举看不到带删除标记的键,排查「对象明明删了还能计费」时要用版本列举确认是否仍有历史版本残留。
带版本号的删除与生命周期中的过期清理都会永久移除数据,务必确认目标版本与保留要求后再执行,事后无法恢复。