

# 管理删除标记
<a name="ManagingDelMarkers"></a>

## 配置生命周期以自动清理过期的删除标记
<a name="LifecycleDelMarker"></a>

过期的对象删除标记是指，删除所有对象版本而只保留一个删除标记。如果生命周期配置设置为删除当前版本，或显式设置了 `ExpiredObjectDeleteMarker` 操作，则 Amazon S3 会删除过期对象的删除标记。有关示例，请参阅[在启用了版本控制的存储桶中移除到期对象删除标记](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)。

## 删除删除标记以使旧版本变为当前版本
<a name="RemDelMarker"></a>

当您删除启用了版本控制的存储桶中的某个对象时，所有版本都将保留在存储桶中并且 Amazon S3 将为该对象创建一个删除标记。要取消删除该对象，您必须删除此删除标记。有关版本控制和删除标记的更多信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

要永久删除“删除标记”，必须在 `DeleteObject versionId` 请求中包含其版本 ID。下图显示了 `DeleteObject versionId` 请求如何永久删除“删除标记”。

![\[图中显示了使用其版本 ID 的删除标记删除。\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarkerVersioned.png)


去除删除标记的效果是：简单的 `GET` 请求现在将检索对象的当前版本 ID（121212）。

**注意**  
如果在当前版本是一个删除标记（未指定删除标记的版本 ID）的情况下使用 `DeleteObject` 请求，Amazon S3 将不会删除该删除标记，而是对另一个删除标记执行 `PUTs` 请求。

要删除具有 `NULL` 版本 ID 的删除标记，必须在 `DeleteObject` 请求中将 `NULL` 作为版本 ID 传递。下图显示了在没有版本 ID（当前版本是一个删除标记）的情况下如何发出简单的 `DeleteObject` 请求，未删除任何内容，而是再添加一个具有唯一版本 ID (7498372) 的删除标记。

![\[图中显示了使用 NULL 版本 ID 的删除标记删除。\]](http://docs.amazonaws.cn/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarker.png)


## 使用 S3 控制台
<a name="undelete-objects"></a>

按照以下步骤，从 S3 存储桶中恢复文件夹之外的已删除对象，包括这些文件夹中的对象。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在**存储桶**列表中，请选择您想要的存储桶的名称。

1. 要查看存储桶中对象的**版本**列表，请选择**列出版本**开关。您将能够看到已删除对象的删除标记。

   

1. 要取消删除对象，您必须删除掉删除标记。选中要恢复的对象的**删除标记**旁边的复选框，然后选择 **Delete (删除)**。

1. 在 **Delete objects (删除对象)** 页面上确认删除。

   1. 对于 **Permanently delete objects?**（永久删除对象？），输入 **permanently delete**。

   1. 请选择 **Delete objects**（删除对象）。

**注意**  
您无法使用 Amazon S3 控制台取消删除文件夹。您必须使用 Amazon CLI 或 SDK。例如，请参阅 Amazon 知识中心中的[如何检索启用版本控制的存储桶中已被删除的 Amazon S3 对象？](https://www.amazonaws.cn/premiumsupport/knowledge-center/s3-undelete-configuration/)。

## 使用 REST API
<a name="delete-marker-rest-api"></a>

**永久删除“删除标记”的步骤**

1. 将 `versionId` 设置为要删除的删除标记的版本 ID。

1. 发送 `DELETE Object versionId` 请求。

**Example — 删除“删除标记”**  
以下示例删除用于 `photo.gif` 版本 4857693 的删除标记。  

```
1. DELETE /photo.gif?versionId=4857693 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

删除“删除标记”时，Amazon S3 将在响应中包含以下内容：

```
1. 204 NoContent 
2. x-amz-version-id: versionID 
3. x-amz-delete-marker: true
```

## 使用 Amazon SDK
<a name="remove-delete-marker-examples-sdk"></a>

有关使用其他 Amazon SDK 的信息，请参阅 [Amazon 开发人员中心](https://www.amazonaws.cn/code/)。

------
#### [ Python ]

以下 Python 代码示例演示了如何从对象中删除“删除标记”，从而使最新的非当前版本成为对象的当前版本。

```
def revive_object(bucket, object_key):
    """
    Revives a versioned object that was deleted by removing the object's active
    delete marker.
    A versioned object presents as deleted when its latest version is a delete marker.
    By removing the delete marker, we make the previous version the latest version
    and the object then presents as *not* deleted.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that contains the object.
    :param object_key: The object to revive.
    """
    # Get the latest version for the object.
    response = s3.meta.client.list_object_versions(
        Bucket=bucket.name, Prefix=object_key, MaxKeys=1
    )

    if "DeleteMarkers" in response:
        latest_version = response["DeleteMarkers"][0]
        if latest_version["IsLatest"]:
            logger.info(
                "Object %s was indeed deleted on %s. Let's revive it.",
                object_key,
                latest_version["LastModified"],
            )
            obj = bucket.Object(object_key)
            obj.Version(latest_version["VersionId"]).delete()
            logger.info(
                "Revived %s, active version is now %s  with body '%s'",
                object_key,
                obj.version_id,
                obj.get()["Body"].read(),
            )
        else:
            logger.warning(
                "Delete marker is not the latest version for %s!", object_key
            )
    elif "Versions" in response:
        logger.warning("Got an active version for %s, nothing to do.", object_key)
    else:
        logger.error("Couldn't get any version info for %s.", object_key)
```

------