对象删除
概述
此页面总结了 DELETE
操作如何影响对象,具体取决于包含该对象的桶的配置。
以下因素的任何组合都可能影响 DELETE
操作的功能
权限
MinIO 使用 基于策略的访问控制 系统进行访问管理。用户或服务帐户必须提供正确的策略操作和条件才能允许对桶和对象进行 DELETE
操作。
未版本控制的对象
当对未启用版本控制的桶中的对象执行 DELETE
操作时,该操作很简单。在验证用户或服务帐户是否有权执行 DELETE
操作后,MinIO 会永久删除该对象。
请求删除操作的用户或服务帐户必须对桶和对象具有 s3:DeleteObject
操作权限。
版本控制的对象
当对象被版本控制时,DELETE
操作的工作方式有所不同。
用户或服务帐户必须对桶和对象具有 s3:DeleteObjectVersion
操作权限。
对当前版本的删除操作
对版本控制的对象执行 DELETE
操作,但不指定版本 UUID,会导致创建 DeleteMarker
,并将其放置为对象的 head
。
在这种情况下,MinIO 不会实际从磁盘中删除对象或其任何版本。对象的所有现有版本仍然可以通过指定版本的 UUID 来访问。当 DeleteMarker
是对象的头部时,MinIO 不会为未指定版本 ID 的 GET
请求提供服务。相反,MinIO 会返回类似 404
的响应。
您可以使用 mc ls --versions
查找对象版本的 UUID。
要从驱动器中删除对象的当前版本,请找到版本的 UUID,然后使用 mc rm --version-id=UUID ...
删除当前版本。在这种情况下,对象的紧邻前一个版本将成为对象的新当前版本,供未指定 UUID 的 GET
请求使用。
警告
在 DELETE 操作中指定 version-id
是不可逆的。MinIO 会从驱动器中删除指定的版本,并且 **无法** 检索它。
对先前版本的 DELETE 操作
要删除对象的先前版本,请指定版本的 UUID。您可以使用 mc ls --versions
检索版本 UUID。当 DELETE
请求指定 version-id
并且用户具有删除对象版本的正确权限时,MinIO 会永久从驱动器中删除指定的版本。
警告
在 DELETE 操作中指定 version-id
是不可逆的。MinIO 会从驱动器中删除指定的版本,并且 **无法** 检索它。
删除所有版本
使用 mc rm --versions
删除对象的所有版本。这是不可逆的。
生命周期管理过期
您可以定义一个或多个 生命周期管理过期规则,以便在达到特定版本号计数或一段时间后使对象过期。当存在超过规则指定的版本数量,或版本超过指定时间时,MinIO 会永久从驱动器中删除对象版本。
这些规则依赖于 扫描器 在存储桶上处理规则。扫描器作为优先级较低的连续进程运行,其中 READ
和 WRITE
操作优先。因此,满足过期要求的对象版本可能不会立即从 MinIO 中删除。
有关扫描器工作原理和配置选项的更多详细信息,请参阅 扫描器 页面。
DeleteMarkers
是它们自己的对象。生命周期规则可以删除作为其对象的唯一剩余版本的 DeleteMarkers
。
在版本 MinIO 中更改: RELEASE.2024-05-01T01-11-10Z
使用 JSON
,生命周期规则可以在指定天数后删除已删除对象的所有版本。
保留的对象
MinIO 会保护受 锁定规则 影响的对象免于被覆盖或删除。这些规则要求对象保留,直到规则过期或被删除。
对锁定对象执行未指定版本的 DELETE
操作会导致为该对象创建 DeleteMarker。但是,对象版本本身会根据锁的要求保留。
指定对象版本的 DELETE
操作受保留规则约束。MinIO 会保护受锁影响的对象版本,直到锁过期或被删除为止,防止它们被覆盖或删除。
复制的对象
复制将对象从一个位置复制到另一个位置。MinIO 支持在存储桶级别或集群(“站点”)级别进行复制。
DELETE 操作可能会或可能不会复制,具体取决于复制的类型以及复制的配置方式。
站点复制
对于启用了 多站点复制 的集群,MinIO 会将对任何集群执行的所有 delete
操作复制到对等组中的每个其他集群。
任何单个对等的 DELETE 行为遵循与任何 MinIO 部署相同的流程。
存储桶复制
使用 存储桶复制,MinIO 支持在源存储桶和配置的远程存储桶之间复制 DELETE 操作。MinIO 会同步删除特定对象版本以及新的 删除标记。DELETE 操作复制使用与所有其他复制操作相同的 复制过程。
MinIO 需要明确启用版本化的 DELETE 和 DELETE 标记复制。使用 mc replicate add --replicate
字段分别指定 delete
和 delete-marker
或两者以启用版本化的 DELETE 和 DELETE 标记复制。要同时启用两者,请使用逗号分隔符指定两个字符串:delete,delete-marker
。
对于 DELETE 标记复制,MinIO 会在 DELETE 操作创建 DELETE 标记后开始复制过程。MinIO 使用 X-Minio-Replication-DeleteMarker-Status
元数据字段跟踪 DELETE 标记复制状态。在 主动-主动 复制配置中,如果两个集群同时为对象创建 DELETE 标记,或如果一个或两个集群在复制事件同步之前处于关闭状态,MinIO 可能会生成重复的 DELETE 标记。
对于复制特定对象版本的删除,MinIO 会将该对象版本标记为 PENDING
,直到复制完成。远程目标删除该对象版本后,MinIO 会删除源上的该对象版本。虽然此过程可以确保版本删除的近乎同步,但它可能会导致列出操作在初始 DELETE 操作后返回对象版本。MinIO 使用 X-Minio-Replication-Delete-Status
跟踪删除版本复制状态。
MinIO 仅复制明确的客户端驱动的 DELETE 操作。MinIO 不会复制由 生命周期管理过期规则 删除的对象。对于 主动-主动 配置,请在所有复制存储桶上设置相同的过期规则,以确保一致地应用对象过期。
MinIO 在源存储桶和远程存储桶上修剪空对象前缀
如果 DELETE 操作删除了存储桶前缀中的最后一个对象,MinIO 会递归地删除从存储桶根目录开始的每个空部分。MinIO 仅将递归删除应用于作为对象写入操作的一部分隐式创建的前缀。MinIO 不会递归地删除使用显式目录创建命令创建的前缀,例如 mc mb
。
如果复制规则启用了复制 DELETE 操作,复制过程也会在目标 MinIO 集群上应用隐式前缀修剪行为。
例如,考虑一个名为 photos
的存储桶,其中包含以下对象前缀
photos/2021/january/myphoto.jpg
//2021/january/
隐式创建,基于对象名称photos/2021/february/myotherphoto.jpg
//2021/february/
隐式创建,基于对象名称photos/NYE21/NewYears.jpg
//NYE21/
在存储桶中显式创建
photos/NYE21
是使用 mc mb
显式创建的唯一前缀。所有其他前缀都是作为写入位于该前缀的对象的一部分隐式创建的。
命令会删除
myphoto.jpg
。MinIO 会自动修剪空的/january/
前缀。然后,一条命令会删除
myotherphoto.jpg
。MinIO 会自动修剪/february/
前缀 *和* 现在为空的/2021
前缀。一条命令会删除
NewYears.jpg
对象。MinIO 会保留/NYE21/
前缀,因为它是由 *明确* 创建的。