首页 > 解决方案 > 使用 c# 库恢复 azure blob 快照

问题描述

我正在编写一个 CLI 实用程序,它可以做很多不同的事情,但我现在正在努力解决的是我有一个已知的 blob。对于那个 blob,我想恢复为那个 blob 拍摄的快照

await foreach (var snapshot in containerClient.GetBlobsAsync(
    BlobTraits.All,
    BlobStates.Snapshots,
    blobPath))
{
    _logger.LogInformation($"found blob {snapshot.Name} - {snapshot.Snapshot}");
    if (DecideIfRightSnapshot(snapshot)) {
        BlobClient snapshotBlob = containerClient.GetBlobClient(snapshot.Name);
        _logger.LogInformation($"found snapshot {snapshotBlob.Uri}");
        await sourceBlob.StartCopyFromUriAsync(snapshotBlob.Uri);
    }
    break;
}

首先,过滤器无法正常工作,因为列表中的最后一个 blob 始终是基本 blob。但我可以解决那个问题。

我正在努力解决的真正问题是使用库从快照中恢复 blob 的正确方法?我真的很担心,因为该.Uri函数总是返回基本文件的 uri,即使它是一个快照。我被引导相信 URI 会是这样的

https://me.blob.core.windows.net/myapp/doc?snapshot=2020-12-16T17:07:44.1076450Z

但这不是正在记录的 URI。我应该自己构建完整的 URI 吗?

在所有搜索中,他们将此称为“推广”快照。但我在 API 中找不到“提升”方法。

我这样做对吗?

标签: c#azureazure-blob-storage

解决方案


如果您使用的是新版本的 blob 存储 sdk:Azure.Storage.Blobs,那么您应该自己构建完整的 URI。示例代码如下:

//other code

await foreach (var snapshot in containerClient.GetBlobsAsync(
BlobTraits.All,
BlobStates.Snapshots,
blobPath))
{

_logger.LogInformation($"found blob {snapshot.Name} - {snapshot.Snapshot}");


if(DecideIfRightSnapshot(snapshot)) {
    BlobClient snapshotBlob = containerClient.GetBlobClient(snapshot.Name);

    //construct the snapshot url
    var snapshot_uri = snapshotBlob.Uri.ToString() + "?snapshot=" + snapshot.Snapshot;


    _logger.LogInformation($"found snapshot {snapshot_uri }");
    await sourceBlob.StartCopyFromUriAsync(snapshot_uri);
 }
 break;
}

对于升级,这意味着您通过 azure 门户恢复快照。这是一个 UI 操作,实际上它调用Put Blob From URL api。目前,sdk中没有这种方法。

但是如果你使用一些像WindowsAzure.Storage这样的旧包,它有很多方法来操作快照,请参阅这篇文章。注意:不建议使用旧包。


推荐阅读