Azure存储帐户备份(表和blob)

时间:2014-06-04 12:41:36

标签: azure backup azure-storage

我需要定期备份Azure存储帐户中的所有blob和表,以便我们可以在以后因任何原因损坏我们的数据而恢复所有数据。

虽然我相信我们存储在Azure中的数据是持久的并且在数据中心发生故障时可以恢复,但我们仍然需要备份存储帐户中的数据以防止意外覆盖和删除(人为错误因素)。

我们为此实施了一个解决方案,定期列出所有blob并将其复制到备份存储帐户。修改或删除blob后,我们只需在备份帐户中创建旧版本的快照。

这种方法对我们有效。但它只处理blob,而不是表实体。我们现在也需要支持备份表实体。

现在面对这项任务,我想其他人可能之前已经有了这个要求,并提出了一个智能解决方案。或者也许有商业产品可以做到这一点?

备份目标不是另一个Azure存储帐户。我们所需要的只是一种恢复所有blob和表的方法,就像我们运行备份时一样。

感谢任何帮助!

3 个答案:

答案 0 :(得分:9)

有多种方法可以处理。

如果您想自己动手,可以使用存储库并编写代码来运行表格并下拉数据。

也有一些服务可以为您做到这一点(完全披露:我为一家提供此服务的公司工作)。以下是Troy Hunt撰写的关于我们选项的文章:http://www.troyhunt.com/2014/01/azure-will-save-you-from-unexpected_28.html。我们还有PowerShell Cmdlet可以为您提取表格数据(cerebrata.com)。公平地说,我们不是这个领域的唯一参与者,还有其他人也有类似的服务。

最后,在Tech Ed,他们宣布AZCopy工具将在今年晚些时候更新,以便它可以拉下整个表格,这只是自动读取表格并将其拉下来。目前没有办法快照"快照"一个表,所以上面的所有方法都会在复制数据时产生副本,在复制完成时它可能在源表中发生了变化。

答案 1 :(得分:3)

我最近整理了一个简单的备份表存储解决方案。它使用AzCopy工具和Storage Rest Api下拉所有表的列表并对JSON进行备份。

希望它有用!

param(
[parameter(Mandatory=$true)]
[string]$Account,
[parameter(Mandatory=$true)]
[string]$SASToken,
[parameter(Mandatory=$true)]
[string]$OutputDir
)
$ErrorActionPreference = "Stop"

##Example Usage
#.\Backup-TableStorage.ps1 -OutputDir "d:\tablebackup" -Account "examplestorageaccount" -SASToken "?sv=2015-04-05&ss=t&srt=sco&sp=rl&st=2016-04-08T07%3A44%3A00Z&se=2016-04-09T07%3A55%3A00Z&sig=CNotAREALSIGNITUREBUTYOURESWOUDLGOHERE3D"

if (-not (Test-Path "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\AzCopy\AzCopy.exe"))
{
    throw "Azcopy not installed - get it from here: https://azure.microsoft.com/en-gb/documentation/articles/storage-use-azcopy/"
}

Write-host ""
Write-Host "Starting backup for account" -ForegroundColor Yellow 
Write-host "--------------------------" -ForegroundColor Yellow
Write-Host " -Account: $Account"
Write-Host " -Token: $SASToken"

$response = Invoke-WebRequest -Uri "https://$Account.table.core.windows.net/Tables/$SASToken"
[xml]$tables = $response.Content
$tableNames = $tables.feed.entry.content.properties.TableName

Write-host ""
Write-host "Found Tables to backup" -ForegroundColor Yellow
Write-host "--------------------------" -ForegroundColor Yellow
foreach ($tableName in $tableNames)
{
    Write-Host " -Table: $tableName"
}


foreach ($tableName in $tableNames)
{
    $url = "https://$Account.table.core.windows.net/$tableName"

    Write-host ""
    Write-Host "Backing up Table: $url"-ForegroundColor Yellow
    Write-host "--------------------------" -ForegroundColor Yellow
    Write-host ""

    & "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\AzCopy\AzCopy.exe" /Source:$url /Dest:$OutputDir\$account\ /SourceSAS:$SASToken /Z:"$env:temp\$([guid]::NewGuid()).azcopyJournal"   

    Write-host ""
    Write-host "Backup completed" -ForegroundColor Green
    Write-host ""
    Write-host ""

}

有关使用的更多详细信息,请查看此处:

https://gripdev.wordpress.com/2016/04/08/backup-azure-table-storage-quick-powershell-script/

答案 2 :(得分:0)

您可以使用Slazure Light等免费软件备份任何Azure表存储表(不过blob)。以下C#代码将所有Azure表备份到json文件:

首先下载NuGet包:

  

安装包Azure.Storage.Slazure.Light

在Visual Studio中创建一个控制台应用程序并添加以下代码:

using System;
using System.Linq;
using Microsoft.WindowsAzure.Storage.Table;
using Newtonsoft.Json;
using SysSurge.Slazure.AzureTableStorage;

namespace BackupAzureTableStore
{
    class Program
    {
        /// <summary>
        /// Usage: BackupAzureTableStore.exe "UseDevelopmentStorage=true"
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            var storage = new DynStorage(args.Length == 0 ? "UseDevelopmentStorage=true" : args[0]);

            foreach (var cloudTable in storage.Tables)
            {
                var tableName = cloudTable.Name;
                var fileName = $"{tableName}.json";

                using (var file = new System.IO.StreamWriter(fileName))
                {
                    var dynTable = new DynTable(storage.StorageAccount, tableName);

                    TableContinuationToken token = null; // Continuation token required if > 1,000 rows per table
                    do
                    {
                        var queryResult =
                            dynTable.TableClient.GetTableReference(tableName)
                                .ExecuteQuerySegmented(new TableQuery(), token);
                        file.WriteLine("{{{0} : [", JsonConvert.SerializeObject(tableName));
                        var cntr = 0;
                        foreach (var entity in queryResult.Results)
                        {
                            var dynEntity = dynTable.Entity(entity.PartitionKey, entity.RowKey);
                            dynEntity.LoadAll().ToList(); // Force pre-downloading of all properties

                            file.WriteLine("{0}{1}", cntr++ > 0 ? "," : string.Empty,
                                JsonConvert.SerializeObject(dynEntity));
                        }

                        file.WriteLine("]}");

                        token = queryResult.ContinuationToken;
                    } while (token != null);
                }

            }

            Console.WriteLine("Done. Press a key...");
            Console.ReadKey();
        }
    }
}