

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 針對版本控制進行疑難排解
<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. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 在**儲存貯體**清單中，選擇包含該物件的儲存貯體名稱。

1. 在**物件**清單中，開啟搜尋列右側的**顯示版本**切換，然後在搜尋列中搜尋已刪除的物件。只在儲存貯體上先前已啟用版本控制時，才能使用此切換。

   您也可以使用 [S3 清查來搜尋已刪除的物件](storage-inventory.md#storage-inventory-contents)。

1. 如果您在切換**顯示版本**或建立清查報告之後找不到物件，也找不到物件的[刪除標記](DeleteMarker.md)，則刪除是永久的，而且無法復原該物件。



您也可以從 AWS Command Line Interface () 使用 `HeadObject` API 操作來驗證已刪除物件的狀態AWS CLI。若要這樣做，請使用下列 `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` 命令的詳細資訊，請參閱《AWS CLI 命令參考》**中的 [https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html)。如需永久將刪除標記刪除的詳細資訊，請參閱 [管理刪除標記](ManagingDelMarkers.md)。

## 我想永久刪除版本控制的物件
<a name="delete-objects-permanent"></a>

在已啟用版本控制的儲存貯體中，沒有版本 ID 的 `DELETE` 請求無法永久刪除物件。相反地，這類請求會插入刪除標記。

若要永久刪除已版本控制的物件，您可以從下列方法中選擇：
+ 建立 S3 生命週期規則以永久刪除非目前版本。若要永久刪除非現行版本，請選取**永久刪除物件的非現行版本**，然後在**物件變成非現行版本後的天數**中輸入天數。您可以選擇指定要保留的較新版本數目，方法是在**要保留的較新版本數目**下方輸入值。如需建立此規則的詳細資訊，請參閱[設定 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` 請求只能移除版本 ID 為 `NULL` 的物件。如果物件是在啟用版本控制時上載，則未指定版本 ID 的 `DELETE` 請求會建立該物件的刪除標記。

**注意**  
對於啟用 S3 物件鎖定的儲存貯體，具有受保護`DELETE`物件版本 ID 的物件請求會導致 403 拒絕存取錯誤。沒有版本 ID 的 `DELETE` 物件請求會將刪除標記新增為具有 200 OK 回應之物件的最新版本。無法永久刪除受「物件鎖定」保護的物件，直到移除其保留期和法務保存。如需詳細資訊，請參閱[S3 物件鎖定的運作方式](object-lock.md#object-lock-overview)。

## 啟用儲存貯體版本控制後，我遭遇效能降低
<a name="performance-degradation"></a>

如果刪除標記或已版本控制的物件太多，以及如果未遵循最佳實務，則已啟用版本控制的儲存貯體可能會降低效能。

**刪除標記過多**  
在您於儲存貯體上啟用版本控制之後，對物件所做的 `DELETE` 請求 (沒有版本 ID) 會使用唯一的版本 ID 來建立刪除標記。具有**讓物件的目前版本過期**規則的生命週期組態會將具有唯一版本 ID 的刪除標記新增至每個物件。過多的刪除標記可能會降低儲存貯體中的效能。

儲存貯體上的版本控制暫停時，Amazon S3 會在新建立的物件上，將版本 ID 標記為 `NULL`。在暫停版本控制的儲存貯體中，過期動作會指示 Amazon S3 建立刪除標記，並以 `NULL` 作為版本 ID。在暫停版本控制的儲存貯體中，會針對任何刪除請求建立 `NULL` 刪除標記。當刪除所有物件版本，僅保留單一刪除標記時，這些 `NULL` 刪除標記也稱為過期的物件刪除標記。如果累積了太多 `NULL` 刪除標記，則儲存貯體中的效能會降低。

**已版本控制的物件太多**  
如果已啟用版本控制的儲存貯體包含具有數百萬個版本的物件，則可能會增加 503 服務無法使用錯誤。當注意到針對已啟用 S3 版本控制之儲存貯體的 `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 團隊建議客戶展開調查，以判斷應用程式是否正常運作。例如，一週內每分鐘覆寫相同物件的應用程式可以建立超過一萬個版本。我們建議每個物件儲存不超過十萬個版本。如果您有使用案例需要一或多個物件的數百萬個版本，請聯絡 AWS 支援 團隊以協助您判斷更好的解決方案。

**最佳實務**  
為了防止版本控制相關的效能降低問題，建議您採用下列最佳實務：
+ 啟用生命週期規則，使物件的先前版本過期。例如，您可以建立生命週期規則，在物件變成非目前版本的 30 天後使非目前版本過期。如果您不想要刪除所有的非目前版本，也可以保留多個非目前版本。如需詳細資訊，請參閱[設定 S3 生命週期組態](how-to-set-lifecycle-configuration-intro.md)。
+ 啟用生命週期規則，以刪除儲存貯體中沒有關聯資料物件的過期物件刪除標記。如需詳細資訊，請參閱[移除過期的物件刪除標記](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)。

如需其他 Amazon S3 效能最佳化最佳實務，請參閱[最佳實務設計模式](optimizing-performance.md)。