如何备份 Azure 表和 Blob

Posted

技术标签:

【中文标题】如何备份 Azure 表和 Blob【英文标题】:How Do I Backup Azure Tables and Blobs 【发布时间】:2016-06-20 13:06:12 【问题描述】:

我将数据存储在 Azure 存储表和 Blob 存储中。我想自动备份我的数据,以防止用户或软件问题意外损坏数据。 Microsoft 对此没有很好的解决方案,虽然有自动备份的付费解决方案,但似乎应该有一种直接的方式来备份和恢复这些数据。

【问题讨论】:

对于表存储,使用AzCopy。它工作正常,也可以在自动化脚本中使用。 azcopy.exe /Source:http://PathToYourTableStorage /Dest:C:\YourFolderPath /Key:StorageAccessKey1or2 您也可以在 CI 过程中使用this script。 我制作了this 节点脚本。它只备份对表的更改,因此您可以经常运行它。 一年后有这个功能的消息吗? @Serge,看看我在下面给出的这个问题的答案。我已使用 2018 年 1 月从 Microsoft 支持部门获得的信息对其进行了更新。简短的版本是,不,没有比去年这个时候更好的表和 blob 存储备份支持了。 【参考方案1】:

在对自动备份数据的最佳方法进行了大量研究后,我发现最简单的方法是在使用 AZCopy 的 Azure 虚拟机上的 Windows 任务计划程序中安排作业。 AZCopy 负责将表数据移动到 VM 中,然后返回到 Azure 中的辅助 blob 存储以保存备份。该批处理文件还会导致 AZCopy 将 blob 从源存储帐户直接复制到目标帐户中。

您可以在此链接中查看我如何完成这项工作的详细说明,其中包含指向我用来自动备份的批处理文件的链接: http://www.eastfive.com/2016/03/01/automated-backup-of-azure-storage-tables-and-blobs/

2018 年 2 月 8 日更新此答案: 我在 2018 年 1 月 18 日向 Azure 支持人员提出了这个问题,假设他们现在肯定有办法通过 Azure 中的服务来做到这一点。不幸的是,情况并非如此,并且(根据 Microsoft 支持)没有比第一次提出这个问题时存在的更好的方法来进行表备份。这是来自 2018 年 1 月 24 日支持的答案:

“我已经审查了你的案子,很遗憾没有办法 对整个帐户或容器进行快照,因此是唯一的方法 使用 Azure 存储做快照是通过 blob 迭代和 应用快照然后将快照迁移到辅助 帐户。或者您可以简单地将实际文件复制到另一个帐户 但这会有更高的延迟并且存储成本更高 容量,快照将占用更少并且更快 转让。 我们支持的传输方法是 AzCopy 和 可用于进行自定义迁移的数据移动库 Java 或 C# 中的解决方案。 如果您想自动化这些流程 那么您可以通过 Powershell 和 Azure 自动化或使用 Azure Functions,但可能需要这些解决方案的帮助 纯粹作为我的团队通过另一个支持请求提出 支持 Azure 存储。”

因此,仍然不存在自动执行这些备份的方法。我的团队正在开发一个库来进行备份。当我们完成后,我会在这里发布。

2018 年 5 月 8 日更新此答案: 如前所述,我的团队一直在开发一个库来自动备份。您可以在这里找到该项目: https://github.com/eastfivellc/EastFive.Azure.Storage.Backup。请随时贡献。

2018 年 10 月 18 日更新此答案: 我能够使用 Azure 数据工厂功能在 Azure 中复制数据。我使用数据工厂将数据从源传输到表和 blob 的目标存储。但是,数据移动成本非常高(每次备份数百美元)。因此,这不是备份的解决方案。正如我在上面的帖子(以及下面的答案)中提到的,Azure 数据移动库是这里的最佳解决方案。

【讨论】:

您可能需要重新检查您对 AzCopy 的使用,因为无需将 blob 复制到中间 VM;它旨在直接复制 blob 到 blob。使用表存储,您确实需要复制数据,即使稍后将 json/csv 存储在 blob 中也是如此。 @DavidMakogon,感谢您在我的写作中发现这个错误。我已经更新了答案,以反映表数据是在本地提取的,而 blob 数据是直接推送到目标的。 对不起 - 只是澄清一下。很久很久以前,blob 复制只能通过先转移到临时空间来工作。不知道那个(数据不足)信息是否还在四处飘荡…… 看看这个链接,大卫。它包含有关 AZCopy 的最新信息,并阐明在将 blob 从源复制到目标存储帐户时,复制是在服务器端完成的。 azure.microsoft.com/en-us/documentation/articles/…【参考方案2】:

我们编写了一个用于备份表和 blob 的 .NET library。您可以在 azure 函数计时器触发器中轻松实现这一点。

在这个blog 中,我解释了如何使用 Azure 函数来实现它。

[FunctionName("Function1")]
public static async Task Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log, ExecutionContext context)

  var sourceAccountName = Environment.GetEnvironmentVariable("BackupSourceAccountName");
  var sourceKey = Environment.GetEnvironmentVariable("BackupSourceAccountKey");

  var backupAzureStorage = new Luminis.AzureStorageBackup.BackupAzureStorage(sourceAccountName, sourceKey, log, context.FunctionAppDirectory);

  var destinationAccountName = Environment.GetEnvironmentVariable("BackupDestinationAccountName");
  var destinationKey = Environment.GetEnvironmentVariable("BackupDestinationAccountKey");
  var destinationContainerName = Environment.GetEnvironmentVariable("BackupDestinationContainer");

  // Backup Tables
  await backupAzureStorage.BackupAzureTablesToBlobStorage("table1,table2", destinationAccountName, destinationKey, destinationContainerName, "tables");

  // Backup Blobs
  await backupAzureStorage.BackupBlobStorage("container1,container2", destinationAccountName, destinationKey, destinationContainerName, "blobs");

【讨论】:

【参考方案3】:

您还可以使用第 3 方工具,例如 Cerebrata Azure Management Cmdlets 或 Microsoft Azure 存储团队宣布的 Asynchronous Copy Blob 功能,这实际上允许您将数据从一个存储帐户复制到另一个存储帐户,而无需在本地下载数据。

查看帖子了解更多信息:What is the best way to backup Azure Blob Storage contents。

希望这会有所帮助。

【讨论】:

德里克,感谢您的评论。我查看了 Cerebrata Cmdlets,它们看起来很有希望,但它们是 125 美元,我对 AZCopy.exe 的批处理命令是免费的。此外,如果您查看我上面的回复,您会发现我已经澄清 AZCopy 会在服务器端复制 blob,因此它们永远不需要离开 Azure。表存储是另一回事——表数据必须在本地提取,至少在这一点上是这样。感谢您的反馈。 @Keith Holloway,对不起,我没有注意到这一点,当我附上的帖子发布时,AzCopy 应该还没有公布。到目前为止,AzCopy 应该是在 Azure 中备份数据的最佳方式。 Cerebrata Azure 管理 Cmdlet 已停产!【参考方案4】:

看看Microsoft Azure Storage Data Movement Library

这似乎提供了 AzCopy 的大部分功能,但在一个 nuget 包中,因此您几乎可以在任何您喜欢的地方使用它。

我们在一个触发的网络作业中运行它,它似乎在表和 blob 存储备份方面都表现得非常好。

【讨论】:

从我的原始答案中查看此链接:eastfive.com/2016/03/01/… 我们在 WebJob 中使用相同的库。我同意你的观点,目前,这是备份 AST 的最佳方式。另一方面,我通过 Azure 数据工厂测试了备份。这会奏效,但数据移动的代价太高,以至于这不是一个可行的解决方案。我同意 - WebJob 中的 DML 是最佳选择。 这很有趣。我几乎想为它实现我自己的解决方案。 @KeithHolloway 我也想知道使用数据工厂,所以很高兴知道这可行,但不可行:) Carl,你说这适用于表存储备份,但我在这个 github 上没有看到任何与表相关的内容。有一个开放的功能请求表支持。你如何使用这个包来备份 azure 表?【参考方案5】:

如果你还在寻找这个问题的解决方案,请查看我在 NuGet 上发布的一个包AzureTableUtilities

您可以将表复制到文件或 blob 文件、从文件或 blob 文件恢复表以及复制到同一帐户或不同帐户的另一个表。还可以对 PartitionKey 和 Timestamp 进行过滤。

我还创建了一个参考命令行代码库并将其放在GitHub 上,它允许从命令行或 Docker 容器执行此代码。

如果这与您想要的不完全匹配,请告诉我,我会看看是否可以增强功能。我意识到该工具本身不会“自动”备份 Azure Tables 数据。但是,直接在 Windows 下或在 Docker 容器中使用命令行示例,我认为您可以设置您想要备份的任何进程。

【讨论】:

【参考方案6】:

您可以使用 Microsoft Azure 存储资源管理器来复制/粘贴表格、上传/下载文件系统、Blob、Cosmos、Data Lake 等,这是非常用户友好的工具。

下载链接:https://azure.microsoft.com/en-in/features/storage-explorer/

【讨论】:

此站点的 Azure 存储资源管理器也是一个有用的工具:archive.codeplex.com/?p=azurestorageexplorer。但是,这些工具不提供自动备份,这是本文所涵盖的内容。

以上是关于如何备份 Azure 表和 Blob的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure Blob 存储中备份和还原 Azure SQL 表,反之亦然

如何获取文件、表和队列的 Azure 存储中所有服务的大小?在 JAVA 中

Azure Blob 容器备份和恢复

使用 Powershell 将 Azure 数据库备份到 blob

自动将 Azure Webapp wwwroot 目录备份到 azure blob 存储

Azure SQL 导出无法在 Blob 容器中备份