這一篇我們來聊聊很強大的功能,但是應該是不常用吧,網路上面這資料就少了點,所以在寫測試範例的時候花了一點時間去理解,簡單的說,她可以對某一檔案進行快照,請注意,建立快照時建議加入 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();
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();
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