你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

管理和还原软删除的 Blob

Blob 软删除会在系统中将已删除的数据保留指定的一段时间,可以在意外删除或覆盖单个 Blob 及其版本、快照和元数据时提供保护。 在保留期内,可以将 Blob 还原到它在删除时的状态。 在指定的保留期已过后,Blob 将永久被删除。 有关 Blob 软删除的详细信息,请参阅 Blob 的软删除

Blob 软删除是针对 Blob 数据的综合性数据保护策略的一部分。 若要详细了解 Microsoft 的数据保护建议,请参阅数据保护概述

管理软删除的 Blob

使用 Azure 门户管理软删除的 Blob

可以使用 Azure 门户来查看和还原软删除的 Blob 与快照。

查看已删除的 Blob

将 Blob 软删除后,默认情况下它们不会显示在 Azure 门户中。 若要查看软删除的 Blob,请导航到容器的“概述”页,并切换“显示已删除的 Blob”设置 。 软删除的 Blob 显示为“已删除”状态。

显示如何在 Azure 门户中列出软删除的 Blob 的屏幕截图

接下来,从 Blob 列表中选择已删除的 Blob,以显示其属性。 在“概述”选项卡下,可以看到 Blob 的状态设置为“已删除” 。 门户还会显示在永久删除该 Blob 之前剩余的天数。

显示 Azure 门户中软删除的 Blob 的属性的屏幕截图

显示已删除的快照

删除某个 Blob 也会删除与该 Blob 关联的所有快照。 如果软删除的 Blob 具有快照,也可以在 Azure 门户中显示已删除的快照。 显示软删除的 Blob 的属性,导航到“快照”选项卡,然后切换为“显示已删除的快照” 。

屏幕截图

禁用版本控制时还原软删除的对象

若要在未启用 Blob 版本控制的情况下在 Azure 门户中还原软删除的某个 Blob,请先显示该 Blob 的属性,然后选择“概述”选项卡上的“取消删除”按钮。还原某个 Blob 也会还原在软删除保留期内删除的所有快照 。

显示如何在 Azure 门户中还原软删除的 Blob 的屏幕截图

若要将软删除的快照提升到基础 Blob,请先确保已还原 Blob 的已软删除快照。 选择“取消删除”按钮以还原 Blob 的已软删除快照,即使基础 Blob 本身尚未软删除。 接下来,选择要提升的快照,并使用“提升快照”按钮来用快照内容覆盖基础 Blob。

显示如何将快照提升到基础 Blob 的屏幕截图

启用版本控制时还原软删除的 Blob

若要在启用了版本控制的情况下在 Azure 门户中还原软删除的 Blob,请选择软删除的 Blob 以显示其属性,然后选择“版本”选项卡。选择要提升为当前版本的版本,然后选择“设为当前版本” 。

显示如何在 Azure 门户中提升版本以还原 Blob 的屏幕截图

若要在启用了版本控制的情况下还原已删除的版本或快照,请显示 Blob 的属性,然后选择“概述”选项卡上的“取消删除”按钮 。

注意

启用版本控制后,对已删除的 Blob 选择“取消删除”按钮会还原所有已软删除的版本或快照,但不会还原基础 Blob。 若要还原基础 Blob,必须提升前一个版本。

使用代码管理软删除的 Blob

可以使用 Azure 存储客户端库来还原软删除的 Blob 或快照。 以下示例演示如何使用 .NET 客户端库。

禁用版本控制时还原软删除的对象

若要在未启用版本控制的情况下还原已删除的 Blob,请对这些 Blob 调用取消删除 Blob 操作。 “取消删除 Blob”操作还原已软删除的 Blob,以及与这些 Blob 关联的所有已删除的快照。

对未删除的 Blob 调用“取消删除 Blob”不会起作用。 以下示例对容器中的所有 Blob 调用“取消删除 Blob”,并还原已软删除的 Blob 及其快照:


foreach (BlobItem blob in container.GetBlobs(BlobTraits.None, BlobStates.Deleted))
{
    await container.GetBlockBlobClient(blob.Name).UndeleteAsync();
}

若要还原特定的软删除快照,请先对基础 Blob 调用“取消删除 Blob”操作,然后将所需快照复制到基础 Blob。 以下示例将块 Blob 还原到其最近生成的快照:

// Restore the deleted blob.
await blockBlob.UndeleteAsync();

// List blobs in this container that match prefix.
// Include snapshots in listing.
Pageable<BlobItem> blobItems = container.GetBlobs
                (BlobTraits.None, BlobStates.Snapshots, prefix: blockBlob.Name);

// Get the URI for the most recent snapshot.
BlobUriBuilder blobSnapshotUri = new BlobUriBuilder(blockBlob.Uri)
{
    Snapshot = blobItems
               .OrderByDescending(snapshot => snapshot.Snapshot)
               .ElementAtOrDefault(0)?.Snapshot
};

// Restore the most recent snapshot by copying it to the blob.
blockBlob.StartCopyFromUri(blobSnapshotUri.ToUri());

启用版本控制时还原软删除的 Blob

若要在启用了版本控制的情况下还原软删除的 Blob,请使用复制 Blob从 URL 复制 Blob 操作将前一个版本复制到基础 Blob。

// List blobs in this container that match prefix.
// Include versions in listing.
Pageable<BlobItem> blobItems = container.GetBlobs
                (BlobTraits.None, BlobStates.Version, prefix: blockBlob.Name);

// Get the URI for the most recent version.
BlobUriBuilder blobVersionUri = new BlobUriBuilder(blockBlob.Uri)
{
    VersionId = blobItems
                .OrderByDescending(version => version.VersionId)
                .ElementAtOrDefault(0)?.VersionId
};

// Restore the most recently generated version by copying it to the base blob.
blockBlob.StartCopyFromUri(blobVersionUri.ToUri());

管理软删除的 Blob 和目录(分层命名空间)

可以在拥有分层命名空间的帐户中还原软删除的 Blob 和目录。

使用 Azure 门户管理软删除的 Blob

可以使用 Azure 门户来查看和还原软删除的 Blob 与目录。

查看删除的 Blob 和目录

将 Blob 或目录软删除后,默认情况下它们不会显示在 Azure 门户中。 若要查看软删除的 Blob 和目录,请导航到容器的“概述”页,并切换“显示已删除的 Blob”设置 。 软删除的 Blob 和目录显示为“已删除”状态。 下图显示一个软删除的目录。

显示如何在 Azure 门户中列出软删除的 Blob(已启用分层命名空间的帐户)的屏幕截图。

注意

如果重命名包含软删除项(子目录和 Blob)的目录,则这些软删除项会与目录断开连接,因此当切换“显示已删除 Blob”设置时,它们不会显示在 Azure 门户中。 如果要在 Azure 门户中查看它们,则必须将目录的名称还原为原始名称,或者创建一个使用原始目录名称的单独目录。

接下来,从列表中选择已删除的目录或 Blob,以显示其属性。 在“概述”选项卡下,可以看到状态设置为“已删除” 。 门户还会显示在永久删除该 Blob 之前剩余的天数。

显示 Azure 门户中软删除的 Blob 的属性(已启用分层命名空间的帐户)的屏幕截图。

还原软删除的 Blob 和目录

若要在 Azure 门户中还原软删除的 Blob 或目录,请首先显示 Blob 或目录的属性,然后选择“概述”选项卡上的“取消删除”按钮。下图显示了软删除的目录上的“取消删除”按钮。

显示如何在 Azure 门户中还原软删除的 Blob(已启用分层命名空间的帐户)的屏幕截图。

使用 PowerShell 还原软删除的 Blob 和目录

重要

本部分仅适用于具有分层命名空间的帐户。

  1. 请确保已安装“Az.Storage”预览版模块。 有关详细信息,请参阅通过 PowerShell 启用 Blob 软删除

  2. 使用存储帐户密钥、连接字符串或 Azure Active Directory (Azure AD) 获取存储帐户授权。 有关详细信息,请参阅连接到帐户

    以下示例使用存储帐户密钥获取授权。

    $ctx = New-AzStorageContext -StorageAccountName '<storage-account-name>' -StorageAccountKey '<storage-account-key>'
    
  3. 若要还原软删除项,请使用 Restore-AzDataLakeGen2DeletedItem 命令。

    $filesystemName = "my-file-system"
    $dirName="my-directory"
    $deletedItems = Get-AzDataLakeGen2DeletedItem -Context $ctx -FileSystem $filesystemName -Path $dirName
    $deletedItems | Restore-AzDataLakeGen2DeletedItem
    

    如果重命名包含软删除项的目录,则这些项会与目录断开连接。 如果要还原这些项,则必须将目录的名称还原为原始名称,或者创建一个使用原始目录名称的单独目录。 否则,在尝试还原这些软删除项时,会出现错误。

使用 Azure CLI 还原软删除的 Blob 和目录

重要

本部分仅适用于具有分层命名空间的帐户。

  1. 请确保已安装了 storage-preview 扩展。 有关详细信息,请参阅通过使用 PowerShell 启用 Blob 软删除

  2. 获取删除项列表。

    $filesystemName = "my-file-system"
    az storage fs list-deleted-path -f $filesystemName --auth-mode login
    
  3. 若要还原某个项,请使用 az storage fs undelete-path 命令。

    $dirName="my-directory"
    az storage fs undelete-path -f $filesystemName --deleted-path-name $dirName --deletion-id "<deletionId>" --auth-mode login
    

    如果重命名包含软删除项的目录,则这些项会与目录断开连接。 如果要还原这些项,则必须将目录的名称还原为原始名称,或者创建一个使用原始目录名称的单独目录。 否则,在尝试还原这些软删除项时,会出现错误。

使用 .NET 还原软删除的 Blob 和目录

重要

本部分仅适用于具有分层命名空间的帐户。

  1. 请打开命令提示符或将目录 (cd) 更改为项目文件夹,例如:

    cd myProject
    
  2. 使用 dotnet add package 命令安装 Azure.Storage.Files.DataLake -v 12.7.0 版本的 Azure.Storage.Files.DataLake NuGet 包。

    dotnet add package Azure.Storage.Files.DataLake -v -v 12.7.0 -s https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-net/nuget/v3/index.json
    
  3. 然后,将这些 using 语句添加到代码文件的顶部。

    using Azure;
    using Azure.Storage;
    using Azure.Storage.Files.DataLake;
    using Azure.Storage.Files.DataLake.Models;
    using NUnit.Framework;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
  4. 以下代码将删除目录,然后还原软删除的目录。

    此方法假定你已创建 DataLakeServiceClient 实例。 若要了解如何创建 DataLakeServiceClient 实例,请参阅连接到帐户

       public void RestoreDirectory(DataLakeServiceClient serviceClient)
       {
           DataLakeFileSystemClient fileSystemClient =
              serviceClient.GetFileSystemClient("my-container");
    
           DataLakeDirectoryClient directory =
               fileSystem.GetDirectoryClient("my-directory");
    
           // Delete the Directory
           await directory.DeleteAsync();
    
           // List Deleted Paths
           List<PathHierarchyDeletedItem> deletedItems = new List<PathHierarchyDeletedItem>();
           await foreach (PathHierarchyDeletedItem deletedItem in fileSystemClient.GetDeletedPathsAsync())
           {
             deletedItems.Add(deletedItem);
           }
    
           Assert.AreEqual(1, deletedItems.Count);
           Assert.AreEqual("my-directory", deletedItems[0].Path.Name);
           Assert.IsTrue(deletedItems[0].IsPath);
    
           // Restore deleted directory.
           Response<DataLakePathClient> restoreResponse = await fileSystemClient.RestorePathAsync(
           deletedItems[0].Path.Name,
           deletedItems[0].Path.DeletionId);
    
       }
    
    

    如果重命名包含软删除项的目录,则这些项会与目录断开连接。 如果要还原这些项,则必须将目录的名称还原为原始名称,或者创建一个使用原始目录名称的单独目录。 否则,在尝试还原这些软删除项时,会出现错误。

使用 Java 还原软删除的 Blob 和目录

重要

本部分仅适用于具有分层命名空间的帐户。

  1. 若要开始操作,请在文本编辑器中打开 pom.xml 文件。 将以下依赖项元素添加到依赖项组。

    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-file-datalake</artifactId>
      <version>12.6.0</version>
    </dependency>
    
  2. 然后将这些 imports 语句添加到代码文件。

    Put imports here
    
  3. 以下代码片段将还原名为 my-file 的软删除的文件。

    此方法假定你已创建 DataLakeServiceClient 实例。 若要了解如何创建 DataLakeServiceClient 实例,请参阅连接到帐户

    
    public void RestoreFile(DataLakeServiceClient serviceClient){
    
        DataLakeFileSystemClient fileSystemClient =
            serviceClient.getFileSystemClient("my-container");
    
        DataLakeFileClient fileClient =
            fileSystemClient.getFileClient("my-file");
    
        String deletionId = null;
    
        for (PathDeletedItem item : fileSystemClient.listDeletedPaths()) {
    
            if (item.getName().equals(fileClient.getFilePath())) {
               deletionId = item.getDeletionId();
            }
        }
    
        fileSystemClient.restorePath(fileClient.getFilePath(), deletionId);
     }
    
    

    如果重命名包含软删除项的目录,则这些项会与目录断开连接。 如果要还原这些项,则必须将目录的名称还原为原始名称,或者创建一个使用原始目录名称的单独目录。 否则,在尝试还原这些软删除项时,会出现错误。

使用 Python 还原软删除的 Blob 和目录

重要

本部分仅适用于具有分层命名空间的帐户。

  1. 使用 pip 安装适用于 Python 的 Azure Data Lake Storage 客户端库 12.4.0 或更高版本。 此命令将安装适用于 Python 的 Azure Data Lake Storage 客户端库的最新版本。

    pip install azure-storage-file-datalake
    
  2. 将这些 import 语句添加到代码文件的顶部。

    import os, uuid, sys
    from azure.storage.filedatalake import DataLakeServiceClient
    from azure.storage.filedatalake import FileSystemClient
    
  3. 以下代码将删除目录,然后还原软删除的目录。

    以下代码示例包含名为 service_client、类型为 DataLakeServiceClient 的对象。 若要查看如何创建 DataLakeServiceClient 实例的示例,请参阅连接到帐户

    def restoreDirectory():
    
        try:
            global file_system_client
    
            file_system_client = service_client.create_file_system(file_system="my-file-system")
    
            directory_path = 'my-directory'
            directory_client = file_system_client.create_directory(directory_path)
            resp = directory_client.delete_directory()
    
            restored_directory_client = file_system_client.undelete_path(directory_client, resp['deletion_id'])
            props = restored_directory_client.get_directory_properties()
    
            print(props)
    
        except Exception as e:
            print(e)
    
    

    如果重命名包含软删除项的目录,则这些项会与目录断开连接。 如果要还原这些项,则必须将目录的名称还原为原始名称,或者创建一个使用原始目录名称的单独目录。 否则,在尝试还原这些软删除项时,会出现错误。

后续步骤