使用 .NET 创建和管理 Blob 快照

快照是在某一时间点拍摄的只读版本的 Blob。 本文介绍如何使用适用于 .NET 的 Azure 存储客户端库创建和管理 blob 快照。

有关 Azure 存储中 blob 快照的详细信息,请参阅 Blob 快照

先决条件

  • 本文假设已经设置了项目来使用适用于 .NET 的 Azure Blob 存储客户端库。 要了解有关设置项目的信息,包括包安装、添加 using 指令和创建授权客户端对象,请参阅开始使用 Azure Blob 存储和 .NET
  • 授权机制必须具有使用 blob 快照的权限。 若要了解详细信息,请参阅有关以下 REST API 操作的授权指导:

创建快照

若要创建块 blob 的快照,请使用以下方法之一:

以下代码示例演示如何创建快照。 包含对 Azure.Identity 库的引用,以使用 Microsoft Entra 凭据授权对服务的请求。 若要详细了解如何使用 DefaultAzureCredential 类来授权托管标识访问 Azure 存储,请参阅适用于 .NET 的 Azure 标识客户端库

private static async Task CreateBlockBlobSnapshot(
    string accountName,
    string containerName, 
    string blobName,
    Stream data)
{
    const string blobServiceEndpointSuffix = ".blob.core.chinacloudapi.cn";
    Uri containerUri = 
        new Uri("https://" + accountName + blobServiceEndpointSuffix + "/" + containerName);

    // Get a container client object and create the container.
    BlobContainerClient containerClient = new BlobContainerClient(containerUri,
        new DefaultAzureCredential());
    await containerClient.CreateIfNotExistsAsync();

    // Get a blob client object.
    BlobClient blobClient = containerClient.GetBlobClient(blobName);

    try
    {
        // Upload text to create a block blob.
        await blobClient.UploadAsync(data);

        // Add blob metadata.
        IDictionary<string, string> metadata = new Dictionary<string, string>
        {
            { "ApproxBlobCreatedDate", DateTime.UtcNow.ToString() },
            { "FileType", "text" }
        };
        await blobClient.SetMetadataAsync(metadata);

        // Sleep 5 seconds.
        System.Threading.Thread.Sleep(5000);

        // Create a snapshot of the base blob.
        // You can specify metadata at the time that the snapshot is created.
        // If no metadata is specified, then the blob's metadata is copied to the snapshot.
        await blobClient.CreateSnapshotAsync();
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

删除快照

若要删除 blob,必须先删除该 blob 的所有快照。 可以单独删除快照,或指定在删除源 Blob 时删除所有快照。 如果尝试删除仍包含快照的 Blob,会发生错误。

若要删除 blob 及其快照,请使用以下方法之一,并包括 DeleteSnapshotsOption 枚举:

以下代码示例演示如何在 .NET 中删除 blob 及其快照,其中 blobClientBlobClient 类型的对象:

await blobClient.DeleteIfExistsAsync(DeleteSnapshotsOption.IncludeSnapshots, null, default);

在基本 Blob 上复制 Blob 快照

只要基本 Blob 位于联机层(热态或冷态),就可以在基本 Blob 上执行复制操作来提升快照。 系统将会保留快照,但会使用一个可读写的副本来覆盖其目标。

以下代码示例演示了如何在基本 Blob 上复制 Blob 快照:

public static async Task<BlockBlobClient> CopySnapshotOverBaseBlobAsync(
    BlockBlobClient client,
    string snapshotTimestamp)
{
    // Instantiate BlockBlobClient with identical URI and add snapshot timestamp
    BlockBlobClient snapshotClient = client.WithSnapshot(snapshotTimestamp);

    // Restore the specified snapshot by copying it over the base blob
    await client.SyncUploadFromUriAsync(snapshotClient.Uri, overwrite: true);

    // Return the client object after the copy operation
    return client;
}

资源

若要详细了解如何使用适用于 .NET 的 Azure Blob 存储客户端库来管理 Blob 快照,请参阅以下资源。

有关使用已弃用的 .NET 版本 11.x SDK 的相关代码示例,请参阅使用 .NET 版本 11.x 的代码示例

客户端库资源

另请参阅