[C#][.NET Core] Azure Storage Blob 手把手從頭開始 - 對檔案快照、還原

2019-02-01

這一篇我們來聊聊很強大的功能,但是應該是不常用吧,網路上面這資料就少了點,所以在寫測試範例的時候花了一點時間去理解,簡單的說,她可以對某一檔案進行快照,請注意,建立快照時建議加入 meta 資料,這樣你可以根據 meta 資料裡面的值來確保是否還原該資料,你可以放入日期,這樣你就可以快速的將某資料還原到該時間點。


物換星移,似乎微軟要換成 v12 版本 了,  請參考新的文章 


快照範例 - 這範例我對 TEST2/TEST21/sampleText3.json  這檔案順序的修改內容 每修改一次 就快照一次 並且在 meta 中寫入一個 名為 tag 的標示 1~9

var connsctionString = "your_connection_string"; var cloudStorage = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(connsctionString); var cloudBlobClient = cloudStorage.CreateCloudBlobClient(); var cloudBlobContainer = cloudBlobClient.GetContainerReference("donmablogsample"); var resultCreateContainer = cloudBlobContainer.CreateIfNotExistsAsync().Result; if (resultCreateContainer) { Console.WriteLine("donmablogsample create already."); } Microsoft.WindowsAzure.Storage.Blob.CloudBlobDirectory cloudBlobDirectory = cloudBlobContainer.GetDirectoryReference("TEST2/TEST21/"); for (var i = 1; i <= 10; i++) { var bFileInfo = cloudBlobDirectory.GetBlockBlobReference("sampleText3.json"); bFileInfo.Properties.ContentType = "application/json; charset=utf-8"; bFileInfo.UploadTextAsync("{\"data\":\"測試資料修改" + i + "\"}").GetAwaiter().GetResult(); var meta = new Dictionary<string, string>(); meta.Add("tag", i.ToString()); var result = bFileInfo.CreateSnapshotAsync(meta, null, null, null).Result; } Console.Write("Success");


還原資料 - 這範例我會將所有的快照檔案讀取出來,撈取 TEST2/TEST21/sampleText3.json   的所有快照,並且 對於 meta , tag=9  的那筆快照進行還原

var connsctionString = "your_connection_string"; var cloudStorage = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(connsctionString); var cloudBlobClient = cloudStorage.CreateCloudBlobClient(); var cloudBlobContainer = cloudBlobClient.GetContainerReference("donmablogsample"); //建立如果不存在的話 var resultCreateContainer = cloudBlobContainer.CreateIfNotExistsAsync().Result; Console.WriteLine("donmablogsample create already."); Microsoft.WindowsAzure.Storage.Blob.CloudBlobDirectory cloudBlobDirectory = cloudBlobContainer.GetDirectoryReference("TEST2/TEST21/"); var bbReference = cloudBlobDirectory.GetBlockBlobReference("sampleText3.json"); var res = new List<CloudBlockBlob>(); Microsoft.WindowsAzure.Storage.Blob.BlobContinuationToken continuationToken = null; do { //只看 TEST2/TEST21/sampleText3.json 的快照 var listingResult = cloudBlobContainer.ListBlobsSegmentedAsync("TEST2/TEST21/sampleText3.json", true, Microsoft.WindowsAzure.Storage.Blob.BlobListingDetails.Snapshots, 100, continuationToken, null, new Microsoft.WindowsAzure.Storage.OperationContext { }).Result; continuationToken = listingResult.ContinuationToken; res.AddRange(listingResult.Results.Select(x => (x as Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob)).ToList()); } while (continuationToken != null); foreach (var r in res) { r.FetchAttributesAsync().GetAwaiter().GetResult(); Console.WriteLine("Meta-tag:" + (r.Metadata.ContainsKey("tag") ? (r.Metadata["tag"]) : "") + "," + r.DownloadTextAsync().Result + ";" + " IsSnapShot:" + r.IsSnapshot); } //Recovery from tag:9 //還原 tag 9 的快照 var bFileInfo = cloudBlobDirectory.GetBlockBlobReference("sampleText3.json"); foreach (var r in res) { if (r.IsSnapshot && r.Metadata.ContainsKey("tag")) { if (r.Metadata["tag"] == "9") { var copyResult = bFileInfo.StartCopyAsync(r).Result; Console.WriteLine("Copy Result:" + copyResult); } } }

請注意, 如果有快照檔案 你在 Explorer 中刪除該檔案夾,他會警告你有快照不能夠刪除。


如果你覺得我寫得不好或是太簡單,請看下面的原文吧
reference:
https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-overview
https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudpageblob.createsnapshotasync?view=azure-dotnet#Microsoft_WindowsAzure_Storage_Blob_CloudPageBlob_CreateSnapshotAsync


當麻許的碎念筆記 2014 | Donma Hsu Design.