

# 版本控制故障排除
<a name="troubleshooting-versioning"></a>

以下主题可以帮助您排查一些常见的 Amazon S3 版本控制问题。

**Topics**
+ [我想恢复在启用版本控制的存储桶中意外删除的对象](#recover-objects)
+ [我想永久删除受版本控制的对象](#delete-objects-permanent)
+ [启用存储桶版本控制后，我遇到了性能下降问题](#performance-degradation)

## 我想恢复在启用版本控制的存储桶中意外删除的对象
<a name="recover-objects"></a>

通常，当从 S3 存储桶中删除对象版本时，Amazon S3 无法恢复它们。但是，如果您在 S3 存储桶上启用了 S3 版本控制，则未指定版本 ID 的 `DELETE` 请求无法永久删除对象。而是添加删除标记作为占位符。此删除标记将成为对象的当前版本。

要验证已删除的对象是永久删除还是临时删除（在其所在位置有删除标记），请执行以下操作：

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

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶**列表中，请选择包含对象的存储桶的名称。

1. 在**对象**列表中，开启搜索栏右侧的**显示版本**开关，然后在搜索栏中搜索已删除的对象。仅当之前在存储桶上启用了版本控制时，此开关才可用。

   您也可以使用 [S3 清单来搜索已删除的对象](storage-inventory.md#storage-inventory-contents)。

1. 如果在切换**显示版本**或创建清单报告后找不到对象，也找不到该对象的[删除标记](DeleteMarker.md)，则删除是永久性的，无法恢复该对象。



您还可以使用 Amazon Command Line Interface（Amazon CLI）中的 `HeadObject` API 操作来验证已删除对象的状态。要执行此操作，请使用以下 `head-object` 命令并将 `user input placeholders` 替换为您自己的信息：

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html`

如果您对受版本控制的对象运行 `head-object` 命令，而此对象的当前版本为删除标记，则会收到 404 找不到错误。例如：

调用 HeadObject 操作时发生错误（404）：找不到

如果您对受版本控制的对象运行 `head-object` 命令并提供该对象的版本 ID，Amazon S3 将检索该对象的元数据，确认该对象仍然存在而未被永久删除。

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

```
{
"AcceptRanges": "bytes",
"ContentType": "text/html",
"LastModified": "Thu, 16 Apr 2015 18:19:14 GMT",
"ContentLength": 77,
"VersionId": "Zg5HyL7m.eZU9iM7AVlJkrqAiE.0UG4q",
"ETag": "\"30a6ec7e1a9ad79c203d05a589c8b400\"",
"Metadata": {}
}
```

如果找到该对象并且最新版本是删除标记，则该对象的先前版本仍然存在。由于删除标记是对象的当前版本，因此您可以通过删除该删除标记来恢复对象。

永久移除删除标记后，该对象的第二个最新版本将成为该对象的当前版本，从而使您的对象再次可用。有关如何恢复对象的直观描述，请参阅[移除删除标记](ManagingDelMarkers.md#RemDelMarker)。

要删除对象的特定版本，您必须是存储桶拥有者。要永久删除“删除标记”，必须在 `DeleteObject` 请求中包含其版本 ID。要删除该删除标记，请使用以下命令，然后将 `user input placeholders` 替换为您自己的信息：

****  
`aws s3api delete-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

有关 `delete-object` 命令的更多信息，请参阅《Amazon CLI 命令参考》**中的 [https://docs.amazonaws.cn//cli/latest/reference/s3api/delete-object.html](https://docs.amazonaws.cn//cli/latest/reference/s3api/delete-object.html)。有关永久删除相应删除标记的更多信息，请参阅[管理删除标记](ManagingDelMarkers.md)。

## 我想永久删除受版本控制的对象
<a name="delete-objects-permanent"></a>

在已启用版本控制的存储桶中，没有版本 ID 的 `DELETE` 请求无法永久删除对象。相反，此类请求会插入一个删除标记。

要永久删除受版本控制的对象，可从以下方法中进行选择：
+ 创建 S3 生命周期规则以永久删除非当前版本。要永久删除非当前版本，请选择**永久删除对象的非当前版本**，然后在**对象变为非当前对象后的天数**下输入一个数字。您可以选择在 **Number of newer versions to retain**（要保留的较新版本的数量）下输入一个值，从而指定要保留的较新版本数量。有关创建此规则的更多信息，请参阅[设置 S3 生命周期配置](how-to-set-lifecycle-configuration-intro.md)。
+ 通过在 `DELETE` 请求中包含版本 ID 来删除指定的版本。有关更多信息，请参阅[如何永久删除受版本控制的对象](DeletingObjectVersions.md#delete-request-use-cases)。
+ 创建生命周期规则以使当前版本过期。要使对象的当前版本过期，请选择**将对象的当前版本设为过期**，然后在**创建对象后的天数**下输入一个数字。有关创建此生命周期规则的更多信息，请参阅[设置 S3 生命周期配置](how-to-set-lifecycle-configuration-intro.md)。
+ 要永久删除所有受版本控制的对象以及删除标记，请创建两个生命周期规则：一个用于使当前版本过期并永久删除对象的非当前版本，另一个用于删除过期的对象删除标记。

在启用版本控制的存储桶中，未指定版本 ID 的 `DELETE` 请求只能删除具有 `NULL` 版本 ID 的对象。如果对象是在启用版本控制后上传的，则未指定版本 ID 的 `DELETE` 请求会创建该对象的删除标记。

**注意**  
对于启用了 S3 对象锁定的存储桶，具有受保护对象版本 ID 的 `DELETE` 对象请求会导致 403 拒绝访问错误。没有版本 ID 的 `DELETE` 对象请求会添加删除标记作为该对象的最新版本，响应为 200 OK。受对象锁定保护的对象只有在解除其保留期和法定保留之后才可永久删除。有关更多信息，请参阅 [S3 对象锁定的工作原理](object-lock.md#object-lock-overview)。

## 启用存储桶版本控制后，我遇到了性能下降问题
<a name="performance-degradation"></a>

如果删除标记或受版本控制的对象过多，以及如果未遵循最佳实践，则启用版本控制的存储桶可能会出现性能降低问题。

**删除标记过多**  
对存储桶启用版本控制后，针对对象发出的没有版本 ID 的 `DELETE` 请求将创建具有唯一版本 ID 的删除标记。具有**将对象的当前版本设为过期**规则的生命周期配置会向每个对象添加一个带有唯一版本 ID 的删除标记。过多的删除标记会降低存储桶的性能。

在对存储桶暂停版本控制时，Amazon S3 会对于新创建的对象将版本 ID 标记为 `NULL`。版本控制已暂停的存储桶中的过期操作会导致 Amazon S3 创建一个以 `NULL` 作为版本 ID 的删除标记。在版本控制已暂停的存储桶中，将为任何删除请求创建 `NULL` 删除标记。当删除所有对象版本而只保留单个删除标记时，这些 `NULL` 删除标记也称为过期对象删除标记。如果累积的 `NULL` 删除标记过多，则存储桶的性能会降低。

**受版本控制的对象过多**  
如果启用了版本控制的存储桶包含具有数百万个版本的对象，则可能会出现 503 服务不可用错误。如果您注意到针对启用版本控制的存储存储桶的 `PUT` 或 `DELETE` 对象请求接收的 HTTP 503 服务不可用响应的数量显著增加，则存储桶中可能有一个或多个对象具有数百万个版本。如果您的对象有数以百万计的版本，Amazon S3 会自动限制对该存储桶的请求。限制请求数可以保护您的存储桶免受过多请求流量的影响，但也可能会妨碍对该存储桶发出的其他请求。

要确定哪些对象具有数以百万计的版本，请使用 S3 清单。S3 清单生成一份报告，用于提供存储桶中对象的平面文件列表。有关更多信息，请参阅 [使用 S3 清单对数据进行编目和分析](storage-inventory.md)。

要验证存储桶中是否存在大量受版本控制的对象，请使用 S3 Storage Lens 存储统计管理工具指标来查看**当前版本对象计数**、**非当前版本对象计数**和**删除标记对象计数**。有关 Storage Lens 存储统计管理工具指标的更多信息，请参阅[Amazon S3 Storage Lens 存储统计管理工具指标词汇表](storage_lens_metrics_glossary.md)。

Amazon S3 团队鼓励客户调查重复覆盖同一对象的应用程序（可能会为该对象创建数百万个版本），以确定应用程序是否正常工作。例如，如果某个应用程序每分钟都要覆盖同一个对象，那么在一周时间内创建的版本数量会超过一万个。我们建议，为每个对象存储的版本数不超过十万个。如果您的应用场景需要一个或多个对象的数百万个版本，请联系 Amazon Web Services 支持 团队以获得帮助，从而确定更好的解决方案。

**最佳实践**  
为防止与版本控制相关的性能降级问题，建议您采用以下最佳实践：
+ 启用生命周期规则以使对象的先前版本过期。例如，您可以创建生命周期规则，以使非当前版本在对象变为非当前状态的 30 天后过期。如果您不想全部删除非当前版本，也可以保留多个非当前版本。有关更多信息，请参阅[设置 S3 生命周期配置](how-to-set-lifecycle-configuration-intro.md)。
+ 启用生命周期规则，以删除存储桶中没有关联数据对象的过期对象删除标记。有关更多信息，请参阅[删除过期对象删除标记](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)。

有关其他 Amazon S3 性能优化最佳实践，请参阅[最佳实践设计模式](optimizing-performance.md)。