我需要定期备份Azure存储帐户中的所有blob和表,以便我们可以在以后因任何原因损坏我们的数据而恢复所有数据。
虽然我相信我们存储在Azure中的数据是持久的并且在数据中心发生故障时可以恢复,但我们仍然需要备份存储帐户中的数据以防止意外覆盖和删除(人为错误因素)。
我们为此实施了一个解决方案,定期列出所有blob并将其复制到备份存储帐户。修改或删除blob后,我们只需在备份帐户中创建旧版本的快照。
这种方法对我们有效。但它只处理blob,而不是表实体。我们现在也需要支持备份表实体。
现在面对这项任务,我想其他人可能之前已经有了这个要求,并提出了一个智能解决方案。或者也许有商业产品可以做到这一点?
备份目标不是另一个Azure存储帐户。我们所需要的只是一种恢复所有blob和表的方法,就像我们运行备份时一样。
感谢任何帮助!
答案 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();
}
}
}