如何将 Azure 存储帐户内容(表、队列、blob)复制到其他存储帐户

Posted

技术标签:

【中文标题】如何将 Azure 存储帐户内容(表、队列、blob)复制到其他存储帐户【英文标题】:How to copy Azure storage account contents (tables, queues, blobs) to other storage account 【发布时间】:2021-07-27 13:57:39 【问题描述】:

我正在使用 Azure Durable Functions,我想将“生产数据”存储帐户复制到另一个存储帐户,以测试一些事情(例如数据迁移策略、性能和其他问题)。

为此,我希望找到最简单、最开箱即用的方法,将 Azure 存储帐户的全部内容复制到另一个存储帐户。

那里有东西吗?或者也许是可以执行此操作的 PowerShell 脚本?

(复制仅适用于 blob 对象)

最好的问候

【问题讨论】:

【参考方案1】:

你可以试试 azcopy 功能,看看here:

azcopy copy 'https://mysourceaccount.blob.core.windows.net/mycontainer?sv=2018-03-28&ss=bfqt&srt=sco&sp=rwdlacup&se=2019-07-04T05:30:08Z&st=2019-07-03T21:30:08Z&spr=https&sig=CAfhgnc9gdGktvB=ska7bAiqIddM845yiyFwdMH481QA8%3D' 'https://mydestinationaccount.blob.core.windows.net/mycontainer' --recursive

上面的示例将整个容器从一个帐户复制到另一个帐户。

【讨论】:

【参考方案2】:

Azure 存储帐户由 4 种不同类型的存储组成:blob、文件共享、队列和表。将每种类型复制到新的存储帐户需要不同的方法和/或策略。

您可以使用许多工具来自动化该过程,包括 Az PowerShell 模块、az cli 和 Azure REST API。并非所有工具都提供处理所有 4 种存储类型的方法。

首先,您需要创建一个新的存储帐户来将您的数据复制到其中。请注意,帐户名称不仅在您的租户中是唯一的,而且在全球范围内是唯一的,长度限制为 24 个字符,并且只能由小写字母和数字组成。您可以使用New-AzStorageAccount PowerShell cmdlet 创建新帐户。

斑点

Blob 存储由将 Blob 保存在平面文件结构中的容器组成。您需要从源帐户重新创建每个容器,这可以使用 PowerShell cmdlet New-AzStorageContainer 完成。创建容器后,您可以使用 Start-AzStorageBlobCopy 将 blob 从源帐户中的容器复制到新帐户中的容器中。

文件共享

存储帐户可以包含多个文件共享,每个文件共享都包含不同深度的嵌套文件夹结构。您可以使用New-AzStorageShare 在目标帐户中创建新的文件共享。重新创建文件共享后,您需要遍历每个共享中的文件夹结构以获取所有文件。然后您可以使用New-AzStorageDirectory 重新创建文件夹结构并使用Start-AzStorageFileCopy 将文件复制到新的文件共享中。

队列

由于队列使用发布者订阅者模型并且数据是瞬态的,因此重新创建队列并使用当前发布者用来向新队列填充数据的方法的变体可能是最简单的。您可以使用New-AzStorageQueue 创建新队列。或者,您可以创建新队列并将发布者重新指向它,并且仅在旧队列耗尽后重新指向订阅者。对于您的用例,第一种方法可能更适合。

表格

存储帐户可以包含多个表,每个表都包含多行数据。您可以使用New-AzStorageTable 重新创建表,但这不会复制它们包含的数据。不幸的是,Az 模块中没有执行此操作的 cmdlet,但 AzTable module 包含 Get-AzTableRowAdd-AzTableRow cmdlet,它们应该允许您将行复制到新表中。

总结

在实践中,实现所有这些需要相当长的脚本,只有当您需要处理大量数据和处理错误以确保准确复制时,该脚本才会增长。我开发了一个脚本来处理 blob 和文件共享,它对于我需要的业余项目来说足够健壮和快速。但是,复制大约 10 个帐户需要几个小时,其中最大的帐户包含不到 1Gb 的数据,因此可能无法很好地扩展到商业环境。如果您希望将其用作起点,可以在 here 找到该脚本。

【讨论】:

以上是关于如何将 Azure 存储帐户内容(表、队列、blob)复制到其他存储帐户的主要内容,如果未能解决你的问题,请参考以下文章

Azure存储管理工具

如何将标签添加到在 Microsoft Azure 中创建的文件存储、队列存储和表存储

Azure 存储队列触发 Azure 函数高可用性

访问 Azure 存储帐户中的所有队列

在 Azure 存储帐户表中存储 API 密钥/密码

我们可以使用 Azure 存储队列作为事件源吗?