您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.

启用和管理 blob 版本控制

可以启用 Blob 存储版本控制,以便在修改或删除 blob 时,自动维护之前版本的 blob。 启用 blob 版本控制后,如果错误地修改或删除了数据,则可以还原 blob 的先前版本以恢复数据。

本文介绍如何使用 Azure 门户或 Azure 资源管理器模板启用或禁用存储帐户的 blob 版本控制。 若要详细了解 blob 版本控制,请参阅 Blob 版本控制

备注

具有分层命名空间 (Azure Data Lake Storage Gen2) 的帐户尚不支持此功能。 若要了解详细信息,请参阅 Azure Data Lake Storage Gen2 中提供的 Blob 存储功能

启用 Blob 版本控制

在 Azure 门户中为存储帐户启用 blob 版本控制:

  1. 在门户中导航到存储帐户。
  2. 在“BLOB 服务”下,选择“数据保护” 。
  3. 在“版本控制”部分,选择“已启用” 。

此屏幕截图显示了如何在 Azure 门户中启用 blob 版本控制

修改 blob 以触发新版本

下面的代码示例演示如何使用适用于 .NET 的 Azure 存储客户端库(版本 12.5.1 或更高版本)触发新版本的创建。 运行此示例之前,请确保已为存储帐户启用版本控制。

该示例将创建一个块 blob,然后更新该 blob 的元数据。 更新 blob 的元数据会触发新版本的创建。 该示例将检索初始版本和当前版本,并显示只有当前版本包含元数据。

public static async Task UpdateVersionedBlobMetadata(BlobContainerClient blobContainerClient, 
                                                     string blobName)
{
    try
    {
        // Create the container.
        await blobContainerClient.CreateIfNotExistsAsync();

        // Upload a block blob.
        BlockBlobClient blockBlobClient = blobContainerClient.GetBlockBlobClient(blobName);

        string blobContents = string.Format("Block blob created at {0}.", DateTime.Now);
        byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);

        string initalVersionId;
        using (MemoryStream stream = new MemoryStream(byteArray))
        {
            Response<BlobContentInfo> uploadResponse = 
                await blockBlobClient.UploadAsync(stream, null, default);

            // Get the version ID for the current version.
            initalVersionId = uploadResponse.Value.VersionId;
        }

        // Update the blob's metadata to trigger the creation of a new version.
        Dictionary<string, string> metadata = new Dictionary<string, string>
        {
            { "key", "value" },
            { "key1", "value1" }
        };

        Response<BlobInfo> metadataResponse = 
            await blockBlobClient.SetMetadataAsync(metadata);

        // Get the version ID for the new current version.
        string newVersionId = metadataResponse.Value.VersionId;

        // Request metadata on the previous version.
        BlockBlobClient initalVersionBlob = blockBlobClient.WithVersion(initalVersionId);
        Response<BlobProperties> propertiesResponse = await initalVersionBlob.GetPropertiesAsync();
        PrintMetadata(propertiesResponse);

        // Request metadata on the current version.
        BlockBlobClient newVersionBlob = blockBlobClient.WithVersion(newVersionId);
        Response<BlobProperties> newPropertiesResponse = await newVersionBlob.GetPropertiesAsync();
        PrintMetadata(newPropertiesResponse);
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

static void PrintMetadata(Response<BlobProperties> propertiesResponse)
{
    if (propertiesResponse.Value.Metadata.Count > 0)
    {
        Console.WriteLine("Metadata values for version {0}:", propertiesResponse.Value.VersionId);
        foreach (var item in propertiesResponse.Value.Metadata)
        {
            Console.WriteLine("Key:{0}  Value:{1}", item.Key, item.Value);
        }
    }
    else
    {
        Console.WriteLine("Version {0} has no metadata.", propertiesResponse.Value.VersionId);
    }
}

列出 blob 版本

若要使用 .NET v12 客户端库列出 blob 版本或快照,请在“版本”字段中指定 BlobStates 参数。

下面的代码示例演示如何使用适用于 .NET 的 Azure 存储客户端库(版本 12.5.1 或更高版本)列出 blob 版本。 运行此示例之前,请确保已为存储帐户启用版本控制。

private static async Task ListBlobVersions(BlobContainerClient blobContainerClient, 
                                           int? segmentSize)
{
    try
    {
        // Call the listing operation, specifying that blob versions are returned.
        var resultSegment = blobContainerClient.GetBlobsAsync(default, BlobStates.Version)
            .AsPages(default, segmentSize);

        // Enumerate the blobs returned for each page.
        await foreach (Azure.Page<BlobItem> blobPage in resultSegment)
        {
            foreach (BlobItem blobItem in blobPage.Values)
            {
                string blobItemUri;

                // Check whether the blob item has a version ID.
                if (blobItem.VersionId != null)
                {
                    blobItemUri = string.Format("{0}/{1}?versionId={2}",
                        blobContainerClient.Uri,
                        blobItem.Name,
                        blobItem.VersionId);

                    // Check whether the blob item is the latest version.
                    if ((bool)blobItem.IsLatestVersion.GetValueOrDefault())
                    {
                        blobItemUri += " (current version)";
                    }
                }
                else
                {
                    blobItemUri = string.Format("{0}/{1}",
                        blobContainerClient.Uri,
                        blobItem.Name);
                }
                Console.WriteLine(blobItemUri);
            }
            Console.WriteLine();
        }
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

后续步骤