[Azure] C# + Azure.Storage.Blobs v12 - 建立快照,從快照還原,設定讀取 Metadata
這篇主是要是建立快照,然後取得快照的副本們,之後透過快照去還原,網路上面這資料就少了點,所以在寫測試範例的時候花了一點時間去理解,簡單的說,這可以對某一檔案進行快照,請注意,建立快照時建議加入 meta 資料,這樣你可以根據 meta 資料裡面的值來確保是否還原該資料,你可以放入日期,這樣你就可以快速的將某資料還原到該時間點,當然這也只是我的作法,你可用其他方法來做到..
前置步驟,首先你得安裝新版的 Azure.Storage.Blobs ( https://www.nuget.org/packages/Azure.Storage.Blobs ) 12.7.0 ,不要裝到舊版的,這邊我撰寫案例是用 .net core 3.1;在 Azure
Portal 開一個 儲存體帳戶,並且在左側的存取金鑰中拿到 Connection String.
1. 建立快照,並且設定 meta - 先講解案例 我在 test1 這容器中有一個檔案 sample.txt ,在建立快照的時候,我會寫入 metadata ,Key:TAG , Value: SNAPSHOT_1~SNAPSHOT_10 ,因為我會建立10個快照 所以是 SNAPSHOT_1~SNAPSHOT_10
var blobClient = new Azure.Storage.Blobs.BlobClient(connsctionString, "test1", "sample.txt"); | |
for (var i = 1; i <= 10; i++) | |
{ | |
var meta = new System.Collections.Generic.Dictionary<string, string>(); | |
meta.Add("TAG", "SNAPSHOT_" + i); | |
var res = blobClient.CreateSnapshot(meta); | |
Console.WriteLine(res.Value.Snapshot); | |
} | |
你也可以透過 Microsoft Azure Storage Explorer 檢視你的快照們
2.透過快照還原,這裡面我會列出,是不是快照,而且將 TAG 印出來,如果是空白就是現在的檔案,這裡面比較 tricky 的地方,就是在還原的時候 必須要帶入 ?snapshot=[snapshot_value]
var blobClient = new Azure.Storage.Blobs.BlobContainerClient(connsctionString, "test1"); | |
foreach (var blobItem in blobClient.GetBlobs(Azure.Storage.Blobs.Models.BlobTraits.All, Azure.Storage.Blobs.Models.BlobStates.Snapshots, "sample.txt")) | |
{ | |
Console.WriteLine("\t" + blobItem.Name + "," + (blobItem.Metadata.ContainsKey("TAG") ? blobItem.Metadata["TAG"] : "NO_TAG") + "," + blobItem.Snapshot); | |
//如果判斷 meta : TAG 是 SNAPSHOT_4 就還原它 | |
if (blobItem.Metadata.ContainsKey("TAG") && blobItem.Metadata["TAG"] == "SNAPSHOT_4" && !string.IsNullOrEmpty(blobItem.Snapshot)) | |
{ | |
Azure.Storage.Blobs.BlobClient snapshotBlob = blobClient.GetBlobClient(blobItem.Name); | |
//還原的網址必須加上 ?snapshot= | |
var snapshot_uri = snapshotBlob.Uri.ToString() + "?snapshot=" + blobItem.Snapshot; | |
var liveBlobItem = new Azure.Storage.Blobs.BlobClient(connsctionString, "test1", "sample.txt"); | |
liveBlobItem.StartCopyFromUri(new Uri(snapshot_uri)); | |
} | |
} | |
Result :
sample.txt,SNAPSHOT_1,2020-12-30T02:16:00.4653143Z
sample.txt,SNAPSHOT_2,2020-12-30T02:16:00.5443695Z
sample.txt,SNAPSHOT_3,2020-12-30T02:16:00.6024113Z
sample.txt,SNAPSHOT_4,2020-12-30T02:16:00.6684580Z
sample.txt,SNAPSHOT_5,2020-12-30T02:16:00.7234966Z
sample.txt,SNAPSHOT_6,2020-12-30T02:16:00.7795366Z
sample.txt,SNAPSHOT_7,2020-12-30T02:16:00.8365766Z
sample.txt,SNAPSHOT_8,2020-12-30T02:16:00.8936162Z
sample.txt,SNAPSHOT_9,2020-12-30T02:16:00.9486558Z
sample.txt,SNAPSHOT_10,2020-12-30T02:16:01.0197061Z
sample.txt,SNAPSHOT_4,
大概先寫到這,我是覺得可以做一些特殊用途,方便好用。
搞懂後邏輯也簡單。
refernce:
https://stackoverflow.com/questions/65332174/restore-an-azure-blob-snapshot-using-c-sharp-library