【问题标题】:How to clean an Azure storage Blob container?如何清理 Azure 存储 Blob 容器?
【发布时间】:2019-01-23 20:03:18
【问题描述】:

我只想清理(转储、zap、del .)一个 Azure Blob 容器。我该怎么做?

注意:该容器由 IIS(运行 Webrole)日志 (wad-iis-logfiles) 使用。

【问题讨论】:

    标签: azure blobstore azure-blob-storage


    【解决方案1】:

    使用 Azure CLI 2.0 的单行程序:

    az storage blob delete-batch --account-name <storage_account_name> --source <container_name>
    

    &lt;storage_account_name&gt;&lt;container_name&gt; 替换为适合您情况的值。

    运行可以看到命令的帮助:

    az storage blob delete-batch -h
    

    【讨论】:

    • 在我添加 --account-key 之后效果很好
    • 如果您看到此错误:“不允许此操作,因为 blob 有快照。错误代码:SnapshotsPresent”,您可能需要添加此选项:--delete-snapshots include
    • 如果您有权访问 Azure 门户,则为最佳答案
    • 运行良好。我与命令一起通过了--connection-string。它应该是引号
    • 这对我来说真的很慢。需要寻找替代方案。
    【解决方案2】:

    只有一种方法可以批量删除 Blob,即删除整个容器。正如您所说,在删除容器和您可以再次使用该容器名称之间存在延迟。

    您唯一的其他选择是一次删除一个。如果您可以从存储 Blob 的同一个数据中心执行删除操作,则它会比在本地运行删除操作更快。这可能意味着编写代码(或者您可以将 RDP 放入您的实例之一并安装云资源管理器)。如果您正在编写代码,那么您可以通过并行删除项目来加快整个过程。类似的东西会起作用:

    Parallel.ForEach(myCloudBlobClient.GetContainerReference(myContainerName).ListBlobs(), x => ((CloudBlob) x).Delete());
    

    【讨论】:

    • 效果很好 - 谢谢!一个更正方法是将文件作为平面列表返回,以防使用文件夹:Parallel.ForEach(blobContainer.ListBlobs(useFlatBlobListing: true), x =&gt; ((CloudBlob)x).Delete());
    • 是的,你是对的,那肯定是更安全的选择。
    【解决方案3】:

    更新: 现在(2018 年)更简单的方法是使用 Azure CLI。检查joanlofe's answer :)


    2016 年最简单的方法是使用 Microsoft Azure Storage ExplorerIMO。

    1. 下载 Azure 存储资源管理器并安装
    2. 使用相应的 Microsoft 帐户登录
    3. 浏览到要清空的容器
    4. 单击“全选”按钮
    5. 点击删除按钮

    【讨论】:

    • HOW 在这里非常重要——你必须更多地点击加载,直到你到达 blob 的最后一页,然后点击全选。然后删除。
    • @RobertoBonini 添加了这些步骤。我记得我不必一直加载到最后。
    • 全选可以对“all in page”和“all cached”进行,不需要加载所有页面。顺便说一句,很棒的工具,感谢您分享此信息。
    • Azure 存储资源管理器很棒,但删除文件很慢。尝试清理一个包含 100K+ 文件的容器 - 这将需要很长时间。
    • @absmiths 同意了。我翻阅了 1000 条记录的 20 页(只要不断地点击第 10、20、30 页等),最终将 20k 条记录放入缓存中,看起来加载得很好。然后我点击“全选>缓存”,但只要我点击删除,它就会完全锁定我的笔记本电脑(Core i5 w/8GB RAM)几分钟,直到最终ASE崩溃。重复该过程,结果相同。自 Win7 天或更早以来,还没有见过如此严重的程序崩溃......
    【解决方案4】:

    尝试使用适用于 windows azure 的 cloudberry 产品

    这是链接:http://www.cloudberrylab.com/free-microsoft-azure-explorer.aspx

    您可以在 blob 中搜索特定的扩展名。选择多个 blob 并删除它们

    【讨论】:

      【解决方案5】:

      如果您的意思是要删除一个容器。我建议您检查http://msdn.microsoft.com/en-us/library/windowsazure/dd179408.aspx 以查看删除容器操作(容器和其中包含的任何 blob 稍后在垃圾收集期间被删除)是否可以满足要求。

      【讨论】:

      • 这种方法的问题是如果在创建同名新容器之前没有找到容器,Webrole 会崩溃。
      • 在这种情况下,您唯一的其他选择是列出容器中的所有项目并一次删除它们。
      • @knightpfhor 这就是我使用 Azure 存储资源管理器(来自 Neudesic)所做的事情。但是,尽管我可以选择一个组一起删除,但速度非常慢。
      • 除非我们留下未处理的异常,否则我们的 Web 角色不会崩溃。当对存储进行任何操作时,请将其放入 try catch 块中。然后,如果出现问题,我们可以优雅地恢复我们的应用程序。在这种特殊情况下,如果容器不存在,您可以捕获异常并照常进行。这不会影响您的应用程序逻辑,因为您的目标是使容器不存在。
      • 仅链接的答案被视为错误答案。请充实或删除。
      【解决方案6】:

      如果您对 CLI 方式感兴趣,那么以下代码将帮助您:

      for i in `az storage blob list -c "Container-name" --account-name "Storage-account-name" --account-key "Storage-account-access-key" --output table | awk {'print $1'} | sed '1,2d' | sed '/^$/d'`; do az storage blob delete --name $i -c "Container-name" --account-name "Storage-account-name" --account-key "Storage-account-access-key" --output table; done
      

      它首先获取容器中的 blob 列表并一个一个地删除它们。

      【讨论】:

        【解决方案7】:

        如果您使用的是可以访问该存储帐户的 spark (HDInsight) 集群,那么您可以在命令行中使用 HDFS 命令;

        hdfs dfs -rm -r wasbs://container_name@account_name.blob.core.windows.net/path_goes_here

        真正的好处是集群不太可能出现故障,并且如果您在其上运行屏幕,那么您在删除时不会丢失会话。

        【讨论】:

          【解决方案8】:

          对于这种情况,更好的选择是识别在容器中找到的项目列表。然后从容器中删除每个项目。那是最好的选择。如果您删除容器,您下次应该会遇到运行时错误...

          【讨论】:

            【解决方案9】:

            您可以使用Cloud Combine 删除 Azure 容器中的所有 Blob。

            【讨论】:

              猜你喜欢
              • 2022-07-08
              • 2017-05-20
              • 2016-01-27
              • 1970-01-01
              • 2012-01-17
              • 2020-04-09
              • 2022-12-31
              • 1970-01-01
              • 2022-11-11
              相关资源
              最近更新 更多