Blob 版本設定

你可以啟用 blob versioning 來自動維護物件的舊版本。 啟用 blob 版本控制後,你可以存取較早版本的 blob,以便在資料被修改或刪除時恢復。

注意

啟用儲存體帳戶的 Blob 版本設定之後,該帳戶中 Blob 的每個寫入作業都會導致建立新版本。 因此,啟用 blob 版本管理可能會產生額外成本。 為降低成本,可使用 生命週期管理 政策或 Storage Actions 任務自動刪除先前版本。

Blob 版本管理是多項資料保護功能之一。 選擇合適的功能或功能組合取決於你的工作量以及你要防範的威脅。 欲了解更多 Microsoft 的資料保護建議,請參閱資料保護概述。

版本與快照

blob 版本類似快照,但兩者在製作方式和最適合用途上有所不同。 版本是自動且由系統管理的:當啟用 blob 版本控制時,Azure 儲存體 每次寫入或刪除都會建立新版本,無需應用程式邏輯。 快照是手動且由應用程式驅動的:當應用程式決定需要時,你會明確建立某一時間點的副本。

當你想要自動且持續地防止意外或惡意覆蓋與刪除時,請使用版本控制。 當你想要刻意建立某一時間點的副本時,例如在計畫更新前設置已知良好的檢查點時,請使用快照。 Microsoft 建議一旦啟用版本控制,就停止對區塊 Blob 進行快照。

Blob 版本設定的運作方式

版本會在指定的時間點擷取 Blob 的狀態。 每個版本都有一個版本 ID。 當你為儲存帳號啟用 blob 版本管理時,Azure 儲存體 會在你第一次建立 blob 並每次修改 blob 時,自動建立一個帶有唯一 ID 的新版本。

版本識別碼可以識別目前的版本或舊版。 一個 blob 一次只能有一個目前版本,也就是它的當前狀態。 一個 blob 可以有多個先前版本。

當您建立新的 Blob 時,只會有一個版本存在,而該版本即為目前的版本。 當您修改現有的 Blob 時,目前的版本就會變成舊版。 系統會建立新版本來擷取更新的狀態,而這個新版本就是目前的版本。 當您刪除 blob 時,該 blob 的目前版本就會變成舊版本,而不再是目前的版本。 任何舊版的 Blob 都會保存。

下圖展示了如何在寫入操作中建立版本,以及先前版本如何升級到目前版本:

展示 blob 版本管理運作方式的圖表。 之前的 blob 版本是不可變的,意思是你無法修改內容或元資料。

重要事項

  • 每個 Blob 若有許多版本,可能會增加 Blob 列出作業的延遲。 Microsoft 建議每個 blob 維護少於 1,000 個版本。 你可以使用 生命週期管理 政策或 儲存體動作 任務來自動刪除舊版本。

  • blob 版本管理無法幫助你從意外刪除儲存帳號或容器的事件中恢復。 若要防止意外刪除儲存體帳戶,請設定儲存體帳戶資源的鎖定。 欲了解更多關於鎖定儲存帳戶的資訊,請參閱 對儲存帳戶套用Azure Resource Manager鎖。

版本識別碼

每個 blob 版本都有獨特的版本 ID。 版本 ID 的值就是 blob 更新的時間戳記。 你在建立版本時就指派版本 ID。

你可以透過 blob 的版本 ID 來讀取或刪除特定版本。 如果你沒有包含版本 ID,操作就會針對目前的版本。

當你執行寫入操作來建立或修改 blob 時,Azure 儲存體 會在回應中回傳 x-ms-version-id 標頭。 此標頭包含寫入操作所建立的 blob 目前版本的 ID。

版本 ID 在整個版本的存續期間都保持不變。

寫入作業的版本設定

當你開啟 blob 版本管理時,每個寫入操作都會產生一個新的版本。 寫入作業包括放置 Blob、放置區塊清單、複製 Blob 和設定 Blob 中繼資料。

如果寫入操作建立新的 blob,所產生的 blob 就是該 blob 的當前版本。 如果寫入操作修改了現有的 blob,當前版本會變成先前版本,而新的當前版本則會擷取更新後的 blob。

下圖顯示寫入作業對 Blob 版本有何影響。 為了簡化,本文中的圖表將版本 ID 以簡單的整數值呈現。 實際的版本識別碼是時間戳記。 目前的版本會以藍色顯示,舊版則以灰色顯示。

顯示寫入作業如何影響已設定版本之 Blob 的圖表。

附註

你在啟用版本控制前建立的 blob 並沒有版本 ID。 當你修改那個 blob 時,修改過的 blob 就會變成新的目前版本,而 blob 在更新前的狀態就會變成之前的版本。 目前的版本會被分配一個版本 ID,即其建立時間。

當您為儲存體帳戶啟用 Blob 版本設定時,對區塊 Blob 的所有寫入作業都會觸發建立新版本,但 Put Block 作業除外。

對於分頁 Blob 和附加 Blob,只有一小部分的寫入作業會觸發版本建立。 這些作業包括:

以下操作不會觸發新版本的建立:

要捕捉這些操作的變更,請手動建立快照。 更多資訊請參閱 Blob 快照。

Blob 的所有版本都必須屬於相同的 Blob 類型。 如果 Blob 有舊版,則無法將一個類型的 Blob 覆寫為另一個類型,除非您先刪除該 Blob 及其所有版本。

刪除作業的版本設定

當你執行 Delete Blob 作業但未指定版本 ID 時,當前版本會變成舊版本,且不再有當前版本。 此操作會保留所有先前存在的 blob 版本。

下圖顯示刪除作業對於已設定版本的 Blob 有何影響:

顯示刪除已設定版本之 Blob 的圖表。

若要刪除特定版本的 Blob,請在刪除作業上提供該版本的識別碼。 如果你也啟用了儲存帳號的 blob 軟刪除,系統會保留該版本直到軟刪除保留期結束。

將新資料寫入至 Blob,會為 Blob 建立新的目前版本。 此動作不影響現有版本,如下圖所示。

顯示在刪除之後重新建立已設定版本之 Blob 的圖表。

存取層級

您可以呼叫設定 Blob 階層作業,以將任何版本的區塊 Blob (包括目前的版本) 移至不同的 Blob 存取層。 透過將 Blob 的舊版本移至非經常性存取層或封存層,您可以享受更低的容量定價。 如需詳細資訊,請參閱 Blob 資料的經常性存取層、非經常性存取層、極非經常性存取層和封存存取層。

若要自動化將區塊 Blob 移至適當層級的過程,請建立 生命週期管理 政策、建立 Storage Actions 任務,或啟用 智慧層級。

啟用或停用 Blob 版本設定

關於如何啟用或停用 blob 版本管理的說明,請參見 啟用與管理 blob 版本管理。

停用 Blob 版本設定並不會刪除現有的 Blob、版本或快照集。 當你關閉 blob 版本管理後,就無法建立新的版本。

關閉版本控制後,修改目前版本會產生一個不是版本的 blob。 所有對 Blob 的後續更新都會覆寫其資料,而不會儲存先前的狀態。 所有現有的版本都會保存為舊版。

在停用版本控制後,你可以透過版本 ID 來閱讀或刪除版本。 版本設定停用後,您也可以列出 Blob 的版本。

物件複寫依賴 Blob 版本控制。 在可以停用 Blob 版本設定之前,您必須先刪除帳戶上的任何物件複寫原則。 如需物件複寫的詳細資訊,請參閱區塊 Blob 的物件複寫。

下圖顯示在版本設定停用後修改 Blob,將建立未設定版本的 Blob。 任何與 Blob 相關聯的現有版本都會保存。

此圖表顯示,在版本設定停用後,若修改目前的版本,將會建立非版本的 Blob。

功能支援

啟用 Data Lake Storage Gen2、網路檔案系統(NFS)3.0 協定或 SSH 檔案傳輸協定(SFTP)可能會影響此功能的支援。 如果你啟用了這些功能,請參考Azure 儲存體帳號 中的 Blob 儲存體 功能支援,以評估此功能的支援。

Blob 版本設定適用於標準一般用途 v2、進階區塊 Blob,和舊版 Blob 儲存體帳戶。 啟用階層命名空間以供 Azure Data Lake Storage 使用的儲存帳號目前不被支援。

Azure 儲存體 REST API 版本 2019-10-10 及以上支援 blob 版本管理。

使用 Data Lake Storage API 上傳的 blobs 不支援版本控制。

授與 Blob 版本的操作權限

你可以使用下列其中一種方式,授權存取 Blob 版本:

  • 使用 Azure 角色基礎存取控制(Azure RBAC)來授予 Microsoft Entra 安全主體權限。 Microsoft 建議使用 Microsoft Entra ID,以獲得更優越的安全性與易用性。 欲了解更多關於使用 Microsoft Entra ID 搭配 blob 操作的資訊,請參見 授權存取資料於 Azure 儲存體。
  • 使用共享存取簽章(SAS)來授權存取 blob 版本。 指定代表 blob 版本的已簽署資源類型 bv 的版本 ID,以建立用於對特定版本執行作業的 SAS 權杖。 欲了解更多有關共享存取簽章的資訊,請參見使用共享存取簽章(SAS)授予對 Azure 儲存體資源的有限存取權限。
  • 使用帳戶存取金鑰,透過共用金鑰授權對 Blob 版本執行作業。 如需詳細資訊,請參閱使用共用金鑰進行授權。

Blob 版本設定旨在保護您的資料免於遭受意外或惡意刪除。 若要增強保護,刪除 Blob 版本時必須要有特殊權限。 下列各節說明刪除 Blob 版本所需的權限。

刪除 Blob 版本的 Azure RBAC 動作

下表顯示哪些 Azure RBAC 動作支援刪除 Blob 或 Blob 版本。

描述 Blob 服務作業 Azure RBAC 資料動作需求 Azure 內建角色支援
刪除目前的版本 刪除 Blob Microsoft/Storage/storageAccounts/blobServices/containers/blobs/delete 儲存體 Blob 資料參與者
刪除舊版 刪除 Blob Microsoft.Storage/storageAccounts/blobServices/containers/blobs/deleteBlobVersion/action 儲存體 Blob 資料擁有者

共用存取簽章 (SAS) 參數

Blob 版本已簽署的資源是 bv。 如需詳細資訊,請參閱建立服務 SAS 或建立使用者委派 SAS。

下表顯示在 SAS 上刪除 Blob 版本所需的權限。

權限 URI 符號 允許的作業
刪除 x 刪除 Blob 版本。

現有工作量考量

  • 刪除一個 Blob 不再釋放空間。 啟用版本控制後,刪除 blob 並不會移除它的資料。 目前的版本會變成一個持續存在且持續產生費用的舊版本。 依賴刪除操作來回收儲存空間的工作負載,直到你明確刪除這些版本前,仍會持續產生費用。

  • 頻繁覆寫的工作負載可能會累積多個版本。 版本會持續存在,除非你明確刪除它們。 這種持續性若管理不當,可能導致版本堆積。 為降低成本,應進行區塊層級的變更,讓跨版本的費用以區塊層級計費,以將每個版本的成本降到最低。

功能互動

軟刪除

Blob 版本設定和 Blob 虛刪除是儲存體帳戶建議資料保護設定的一部分。 欲了解更多關於 Microsoft 資料保護建議的資訊,請參閱資料保護概述。

覆寫 Blob

如果您對某個儲存體帳戶同時啟用 Blob 版本設定和 Blob 虛刪除,覆寫 Blob 時會自動建立新的先前版本,以反映該 Blob 在寫入作業前的狀態。 新版本不會被軟刪除,且會持續存在直到明確刪除。 不會建立任何虛刪除的快照集。

刪除 Blob 或版本

如果你同時啟用儲存帳號的版本控制和軟刪除,當你刪除 blob 時,當前版本的 blob 就會變成之前的版本。 這個操作不會建立新版本或任何軟刪除的快照。 虛刪除保留期不適用於已刪除的 Blob。

軟刪除在刪除 blob 版本時提供額外保護。 當你刪除之前版本的 blob 時,操作會軟刪除該版本。 虛刪除的版本會保留到虛刪除保留期間結束為止,屆時就會永久刪除該版本。

若要刪除舊版的 Blob,請呼叫刪除 Blob 作業,並指定版本識別碼。

還原虛刪除的版本

在軟刪除保留期間,使用 取消刪除 Blob 操作來恢復軟刪除的版本。 取消刪除 blob 作業一律會還原所有遭到虛刪除的 blob 版本。 你無法只還原一個軟刪除的版本。

使用 取消刪除 Blob 作業還原已虛刪除的版本時,不會將任何版本提升為目前版本。 若要還原目前的版本,請先還原所有虛刪除的版本,然後使用複製 Blob 作業將舊版複製到新的目前版本。

軟刪除保留期結束後,系統會永久刪除任何軟刪除的 blob 版本。

Blob 快照集

Blob 快照集是在特定時間點拍攝的 Blob 的唯讀副本。 blob 快照和 blob 版本類似,但你或你的應用程式手動建立快照,而 blob 版本則是在你啟用儲存帳號的 blob 版本管理時,透過寫入或刪除操作自動建立。

重要事項

啟用 blob 版本控制後,更新應用程式,以停止對區塊 blob 進行快照。 如果你為儲存帳號啟用版本控制,版本會擷取並保留所有區塊 blob 的更新與刪除。 如果啟用了 blob 版本管理,擷取快照並不會對區塊 blob 資料提供額外保護,反而可能增加成本和應用程式複雜度。

在啟用版本設定時建立 Blob 的快照集

雖然不建議這樣做,但您可以對也已啟用版本控制的 Blob 建立快照集。 如果您在啟用版本設定時無法更新應用程式,以停止建立 Blob 的快照集,則應用程式可以同時支援快照集和版本。

當你對有版本的 blob 擷取快照時,你會同時建立一個新版本。 當你擷取快照時,也會建立一個新的目前版本。

下圖顯示在您為已設定版本的 Blob 建立快照集時,會發生什麼事。 在下圖中,版本識別碼為 2 和 3 的 Blob 版本與快照集包含相同的資料。

顯示版本化 Blob 快照的示意圖。

已知的限制

  • 不支援用於具有階層命名空間(Azure Data Lake Storage)的帳戶,或使用 Data Lake Storage API 上傳的 blob。

  • 它無法防止容器或帳號被刪除。 版本管理只在 blob 層級有效。 刪除容器會移除所有 blob 及其版本。 若要從該次刪除中復原,必須啟用容器軟刪除。 防止帳號被刪除需要資源鎖定項。

  • 版本是不可變更的。 你無法更改現有版本的內容或元資料。

  • Blob 的所有版本都必須屬於相同的 Blob 類型。 當 blob 具有先前版本時,你無法用不同類型的 blob 覆寫它,除非你先刪除該 blob 及其所有版本。

  • 並非所有寫入都會產生版本。 請參考本文前述的例外資訊。 要捕捉這些狀態,請使用手動快照。

  • 無法在帳號上停用版本控制,因為存在物件複製政策。 你必須先刪除所有物件複製策略。

  • Undelete Blob 還原所有軟刪除的 blob 版本,而非單一版本。 你無法選擇性地取消刪除某一個版本。 取消刪除絕不會將某個版本設為目前版本。

  • 建議每個 Blob 上限為 1,000 個版本。 超過這個數值會降低 blob 列表的效能。

價格和計費

啟用 blob 版本管理時,可能會產生額外的資料儲存費用。 在設計應用程式時,請考慮這些費用的累積,以降低成本。

blob 版本(例如 blob snapshots)會依與使用中資料相同的費率計費。 版本的計費方式取決於你是否明確設定了 Blob 目前或先前版本(或快照)的階層。 如需 Blob 階層的詳細資訊,請參閱 Blob 資料的經常性存取層、非經常性存取層、極非經常性存取層和封存存取層。

如果你不更改某個 blob 或版本的層級,你將被收取該 blob、其版本以及任何快照中獨特的資料區塊費用。 如需詳細資訊,請參閱 未明確設定 Blob 層級時的計費。

如果你更改了一個 blob 或版本的階層,無論 blob 和版本是否再次進入同一階層,你都會被計費整個物件。 如需詳細資訊,請參閱:明確設定 Blob 層時的計費。

附註

如果你對經常覆寫的資料啟用版本控制,可能會看到儲存容量費用增加,以及在列出作業期間延遲增加。 為了解決這些問題,建議將經常覆寫的資料存放在已停用版本設定的獨立儲存體帳戶中。

如果你在經常備份的儲存帳戶上啟用版本,當這些版本存放在涼層或冷層存取層級時,可能會觸發資料擷取費用。

若要進一步了解 Blob 快照集的計費詳細資料,請參閱 Blob 快照集。

對於使用智慧層級的儲存體帳戶,您需要依照完整內容長度為版本和快照集付費。 欲了解更多資訊,請參閱 「智慧層級優化成本」。

未明確設定 Blob 層級時的計費

如果你沒有明確設定任何 blob 版本的層級,系統會根據所有版本中獨特的區塊或頁面,以及它可能擁有的任何快照,向你收費。 跨 blob 版本共用的資料只會向你計費一次。 當你更新一個 blob 時,當前新版本的資料會與先前版本中儲存的資料不同,因此你將依每個區塊或頁面的唯一資料量計費。

當你在區塊 Blob 中替換一個區塊時,系統會將該區塊計費為一個唯一區塊。 即使區塊的區塊 ID 和資料與前一版本相同,此規則仍適用。 當你再次提交該區塊後,它會與前一個版本中的對應區塊產生差異,並且你會因其資料而被計費。 同樣的規則也適用於頁面塊中你用相同資料更新的頁面。

blob 儲存無法判斷兩個區塊是否包含相同的資料。 你上傳並提交的每個區塊都會被視為獨一無二,即使它有相同的資料和區塊 ID。 因為系統會依唯一區塊數量計費,請記得啟用版本管理時更新 blob 會產生更多唯一區塊和額外費用。

啟用 Blob 版本控制時,請對區塊 Blob 呼叫更新作業,使其更新的區塊數量盡可能少。 允許對區塊進行精細控制的寫入作業,是放置區塊和放置區塊清單。 Put Block 會將變更暫存,但實際修改和版本建立是在 Put Block List 操作中進行。 另一方面, 放置 Blob 操作會替換整個 blob 的內容,因此可能導致額外收費。

以下情境展示了在未明確設定 Blob 層級的情況下,區塊 Blob 及其版本如何產生費用。

實例 1

在案例 1 中,Blob 有舊版。 該 blob 自建立該版本以來未曾更新,因此你只需為唯一的區塊 1、2 和 3 支付費用。

圖表 1,顯示基底 Blob 和上一個版本中獨特區塊的計費。

案例 2

在情境 2 中,blob 中的一個區塊(圖中的第 3 區塊)會被更新。 雖然更新的區塊包含相同的資料和相同的識別碼,但還是與舊版中的區塊 3 不同。 因此,此帳戶必須支付四個區塊的費用。

圖表 2,顯示基底 Blob 和上一個版本中獨特區塊的計費。

案例 3

在情境三中,blob 已經更新,但版本沒有。 目前的區塊 3 被第 4 區塊取代,但之前的版本仍然反映第 3 區塊。 因此,此帳戶必須支付四個區塊的費用。

圖表 3,顯示基底 Blob 和上一個版本中獨特區塊的計費。

案例 4

在情境 4 中,目前版本完全更新,且不包含其任何原有區塊。 因此,帳號會被收取所有八個獨特區塊的費用——目前版本有四個,前兩個版本合計四個。 這種情況可能發生在你用 Put Blob 操作寫入 blob 時,因為它會替換整個 blob 的內容。

圖表 4,顯示基底 Blob 和上一個版本中獨特區塊的計費。

當你明確設定 blob 層級時的計費

如果你明確設定了 blob、版本或快照的 blob 層級,你就必須依新層級中該 blob、版本或快照的完整內容長度付費,不論它是否與原始層級的物件共用區塊。 您還要為原始層級中最舊版本的完整內容長度付費。 對於任何其他仍保留在原始層級中的舊版或快照集,您必須為它們共用的唯一區塊付費,如未明確設定 Blob 層級時的計費所述。

將 Blob 移至新的階層

下表描述了當你將 blob 或版本移到新層級時的計費行為。

當您設定 Blob 層級時... 您需為下列項目付費...
明確設定為某個版本,無論是目前還是舊版本 該版本的完整內容長度。 未明確設定階層的版本只會針對獨特的區塊計費。1
設定為封存 所有版本與快照的完整內容長度。1

1如果還有其他你未將其從原始層級移出的先前版本或快照,則這些版本或快照會依其包含的唯一區塊數計費,如 Blob 層級未明確設定時的計費所述。

下圖說明了當你將版本化 blob 移到不同層級時,物件的計費方式。

顯示當已設定版本的 Blob 明確分層時,物件如何計費的圖表。

您無法撤銷明確設定 Blob、版本或快照集的層級。 如果你把一個 blob 移到新層級,再移回原本層級,即使它和原始層級的其他物件共用區塊,你還是得支付該物件的完整內容長度。

明確設定 Blob、版本或快照集階層的作業包括:

在虛刪除啟用時刪除 Blob

啟用 Blob 軟刪除時,所有已軟刪除的實體都會依與現有資料相同的費率計費。 如果你刪除或覆寫了你明確為其設定層級的目前版本,你就要按該軟刪除 Blob 的任何先前版本的完整內容長度付費。 欲了解更多關於 blob 版本控制與軟刪除如何協同運作的資訊,請參閱 功能互動。

監視與疑難排解

  • 我的 LCM 政策沒有在預期時刪除版本: 版本的存在時間是根據你最初寫入資料的時間,而不是它成為舊版的時間。 時鐘從 blob 建立開始,而不是從將它推入版本歷史的覆寫開始。 因此,一個在被覆寫前長時間保持最新的 blob,可能會產生一個在建立時就已經超過你 daysAfterCreationGreaterThan 閾值的舊版本,導致它幾乎立刻被刪除。 相反地,最近產生的 blob 版本可能比預期持續更久。 要確認,請檢查版本上的實際建立時間戳記,而不是假設它和覆寫時間一致。 如果你需要根據版本何時變得非最新來決定保留,或想要比生命週期管理的每日閾值更細緻的控制,可以考慮改用 Azure 儲存體 Actions。 更多資訊請參閱 儲存體動作。

  • 停用版本後,我的帳單仍然很高:現有版本會保留,直到你手動刪除它們。

  • 我無法關閉版本控制。 物件複製可能已經在帳號上設定了。 先刪除所有物件複製策略,然後再停用版本控制。 或者,可能存在於容器或帳戶上的不變性(WORM)原則,而該容器或帳戶的版本控制無法停用。

另請參閱