web-dev-qa-db-ja.com

Azureストレージアカウントのバックアップ(テーブルとBLOB)

何らかの理由でデータが破損した場合に後ですべてのデータを復元できるように、AzureストレージアカウントのすべてのBLOBとテーブルを定期的にバックアップする必要があります。

Azureに保存するデータは、データセンターに障害が発生した場合でも永続的で回復可能であると確信していますが、偶発的な上書きや削除(人的エラー要因)を防ぐために、ストレージアカウントのデータをバックアップする必要があります。

すべてのBLOBを定期的に一覧表示し、バックアップストレージアカウントにコピーするこのソリューションを実装しました。 BLOBが変更または削除された場合、バックアップアカウントに古いバージョンのスナップショットを作成するだけです。

このアプローチは私たちにとってはうまくいきました。ただし、テーブルエンティティではなく、blobのみを処理します。テーブルエンティティのバックアップもサポートする必要があります。

今この課題に直面している私は、おそらく他の誰かが以前にこの要件を持っていて、賢い解決策を考え出したと思っています。それとも、これを行う商用製品がありますか?

バックアップターゲットが別のAzureストレージアカウントである必要はありません。必要なのは、バックアップを実行したときのすべてのBLOBとテーブルを回復する方法だけです。

どんな助けでも大歓迎です!

20

これを処理するにはさまざまな方法があります。

自分でこれを実行したい場合は、ストレージライブラリを使用してコードを記述し、テーブルを実行してデータをプルダウンすることができます。

あなたのためにもこれを行うことができるいくつかのサービスもあります(完全開示:私はこれをサービスとして提供する会社で働いています)。これが私たちのオプションについて話しているTroyHuntによる記事です: http://www.troyhunt.com/2014/01/Azure-will-save-you-from-unexpected_28.html 。テーブルデータを取得できるPowerShellコマンドレットもあります(cerebrata.com)。公平を期すために、この分野のプレーヤーは私たちだけではなく、同様のサービスを提供しているプレーヤーもいます。

最後に、Tech Edで、AZCopyツールが今年後半に更新され、テーブル全体をプルダウンできるようになると発表しました。これは、テーブルの読み取りを自動化してプルダウンするだけです。現在、テーブルを「スナップショット」する方法はないため、上記のすべての方法では、データがコピーされるときにコピーが作成されます。コピーが完了するまでにソーステーブルで変更されている可能性があります。

9
MikeWo

私は最近、テーブルストレージをバックアップするための簡単なソリューションをまとめました。 AzCopyツールとStorageRest 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/

3
lawrencegripper

Slazure Lightなどのフリーソフトウェアを使用して、Azure Table Storageテーブル(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();
        }
    }
}
0
user152949