Windows Azure BLOB ストレージ サービスを使用した SQL Server のバックアップと復元

このトピックでは、SQL Server バックアップを構成して Windows Azure BLOB ストレージ サービスに書き込むことと、Windows Azure BLOB ストレージ サービスから復元することを中心とした概念、考慮事項、およびサンプル コードについて説明します。 また、Windows Azure BLOB サービスを使用して SQL Server バックアップを格納する利点の概要についても説明します。

SQL Server 2012 SP1 CU2 でリリースされたこの機能により、SQL Server のバックアップと復元を Windows Azure BLOB サービスとの間で直接実行できるようになりました。 この機能を使用すると、内部設置型インスタンス、または Windows Azure バーチャル マシンなどのホスト環境を実行する SQL Server インスタンスに SQL Server データベースをバックアップできます。 クラウドへのバックアップには、可用性、地理的に離れた場所にレプリケートされたオフサイトの無制限のストレージ、クラウドとの間でのデータ移行の容易さなどの利点があります。 このリリースでは、TSQL または SMO を使用して BACKUP ステートメントや RESTORE ステートメントを実行できます。 SQL Server Management Studio のバックアップと復元ウィザードを使用して Windows Azure BLOB ストレージ サービスへのバックアップまたは Windows Azure BLOB ストレージ サービスからの復元を実行することは、このリリースではできません。

SQL Server 2012 SP1 CU4 では、PowerShell を使用した Windows Azure Blob ストレージ サービスへのバックアップと Windows Azure Blob ストレージ サービスからの復元がサポートされています。 この更新プログラムを要求するには、このサポート技術情報の記事を参照してください。 このトピックの「使用例」には PowerShell スクリプトが用意されています。 サンプルの PowerShell スクリプトで複数のバックアップを管理するには、「Use PowerShell to Backup Multiple Databases to Windows Azure Blob Storage Service」を参照してください。

SQL Server バックアップに Windows Azure BLOB サービスを使用する利点

  • 柔軟で信頼性が高い、オフサイトの無制限のストレージ: Windows Azure BLOB サービスへのバックアップの保存は、便利で柔軟性なアクセスしやすいオフサイトのオプションです。 SQL Server バックアップ用にオフサイト ストレージを作成するのは、既存のスクリプトやジョブを変更するのと同様に簡単です。 オフサイト ストレージは、通常、災害発生時にオフサイトと運用データベース両方の場所に影響しないように、運用データベースの場所から十分に離れた場所に設置する必要があります。 BLOB ストレージを地理的に離れた場所にレプリケートすることによって、地域全体に影響する可能性がある災害が発生した場合の保護レベルが強化されます。 また、バックアップは場所や時間を問わず使用でき、復元のために簡単にアクセスできます。

  • バックアップ アーカイブ: Windows Azure BLOB ストレージ サービスには、バックアップのアーカイブによく使用されるテープ オプションのより優れた代替手段が用意されています。 テープ ストレージでは、オフサイトの施設への物理的な輸送手段とメディアを保護する手段が必要になります。 Windows Azure BLOB ストレージにバックアップを保存すると、すぐに使用できる、可用性が高く、持続性を備えたアーカイブ オプションが提供されます。

  • ハードウェア管理のオーバーヘッドなし: Windows Azure サービスを使用したハードウェア管理にはオーバーヘッドが生じません。 Windows Azure サービスでは、ハードウェアが管理され、ハードウェア障害に対する冗長性と保護を目的として地理的に離れた場所へのレプリケーションが提供されます。

  • 現在、Windows Azure バーチャル マシンで実行している SQL Server インスタンスでは、Windows Azure BLOB ストレージ サービスへのバックアップを実行するために、アタッチされたディスクを作成できます。 ただし、Windows Azure バーチャル マシンにアタッチできるディスク数には制限があります。 この制限は、特大サイズのインスタンスの場合は 16 台のディスク、小さいインスタンスの場合は少ない数になります。 Windows Azure BLOB ストレージに直接バックアップできるようにすることで、16 台のディスク制限がなくなります。

    また、Windows Azure BLOB ストレージ サービスに保存されているバックアップ ファイルは、内部設置型 SQL Server、または Windows Azure バーチャル マシンで実行している別の SQL Server で直接使用できます。その際、データベースのアタッチ/デタッチや、VHD のダウンロードとアタッチは必要ありません。

  • コスト面での利点: 使用するサービスにのみ料金がかかります。 オフサイトのバックアップ アーカイブ オプションとして、高いコスト効果を得ることができます。 詳細とリンクについては、「Windows Azure の課金に関する注意点」を参照してください。

Windows Azure の課金に関する注意点:

Windows Azure ストレージのコストを把握しておくと、Windows Azure でバックアップを作成および格納するコストを予測できます。 

Windows Azure 料金計算ツールを使用すると、コストを見積もることができます。

ストレージ: 料金は使用領域に基づいており、段階的に、また、冗長性のレベルに応じて計算されます。 詳細と最新情報については、「料金の詳細」の「データ管理」を参照してください。

データ転送: Windows Azure への受信データ転送は無料です。 送信転送は、帯域幅の使用量に対して課金され、段階的な地域固有の区分に基づいて計算されます。 詳細については、「料金の詳細」の「データ転送」を参照してください。

要件、コンポーネント、および概念

このセクションの内容:

  • セキュリティ

  • 主なコンポーネントと概念の概要

  • Windows Azure BLOB ストレージ サービス

  • SQL Server のコンポーネント

  • 制限事項

  • BACKUP/RESTORE ステートメントのサポート

セキュリティ

Windows Azure BLOB ストレージ サービスへのバックアップや Windows Azure BLOB ストレージ サービスからの復元を実行する場合のセキュリティに関する注意点と要件は次のとおりです。

  • Windows Azure BLOB ストレージ サービスのコンテナーを作成する際は、アクセス権を private に設定することをお勧めします。 アクセス権を private に設定すると、Windows Azure アカウントの認証に必要な情報を指定できるユーザーまたはアカウントだけがアクセスできるようになります。

    セキュリティに関する注意セキュリティに関する注意

    SQL Server では、Windows Azure のアカウント名とアクセス キー認証を SQL Server 資格情報に格納する必要があります。 この情報は、バックアップ操作または復元操作の実行時に Windows Azure アカウントを認証するために使用されます。

  • BACKUP コマンドまたは RESTORE コマンドの実行に使用するユーザー アカウントは、Alter any credential 権限を持つ db_backup operator データベース ロールに属している必要があります。

インストールの前提条件

  • Azure バーチャル マシンで実行されている SQL Server: Windows Azure バーチャル マシンに SQL Server をインストールする場合、SQL Server 2012 SP1 CU2 をインストールするか、既存のインスタンスを更新します。 マイクロソフト カスタマー サポートから更新プログラムを要求するには、こちらの記事を参照してください。

  • SQL Server 内部設置型: この機能は、SQL Server 2012、SP1 CU2、またはそれ以降のバージョンに含まれています。 マイクロソフト カスタマー サポートから更新プログラムを要求するには、こちらの記事を参照してください。

主なコンポーネントと概念の概要

次の 2 つのセクションでは、Windows Azure BLOB ストレージ サービスと、Windows Azure BLOB ストレージ サービスへのバックアップ時や Windows Azure BLOB ストレージ サービスからの復元時に使用する SQL Server コンポーネントについて説明します。 Windows Azure BLOB ストレージ サービスへのバックアップや Windows Azure BLOB ストレージ サービスからの復元を実行するには、各コンポーネントと、コンポーネント間のやり取りを理解しておくことが重要です。

このプロセスは、Windows Azure アカウントを作成することから始まります。 SQL Server では、Windows Azure storage account name とその access key の値を使用して、認証し、ストレージ サービスとの間で BLOB の書き込みと読み取りを行います。 SQL Server 資格情報はこの認証情報を格納するため、バックアップ操作または復元操作中に使用されます。 ストレージ アカウントを作成して単純な復元を実行する完全なチュートリアルについては、「チュートリアル: Windows Azure BLOB ストレージ サービスへの SQL Server のバックアップと復元の概要」を参照してください。

sql 資格情報へのストレージ アカウントのマッピング

Windows Azure BLOB ストレージ サービス

ストレージ アカウント: ストレージ アカウントは、すべてのストレージ サービスの開始点となります。 Windows Azure BLOB ストレージ サービスにアクセスするには、最初に Windows Azure ストレージ アカウントを作成してください。 Windows Azure BLOB ストレージ サービスとそのコンポーネントを認証するには、storage account name プロパティとその access key プロパティが必要です。

コンテナー: コンテナーは、一連の BLOB をグループ化するコンテナーで、BLOB を無制限に格納できます。 Windows Azure BLOB サービスに SQL Server バックアップを書き込むには、少なくともルート コンテナーを作成しておく必要があります。

BLOB: 任意の種類とサイズのファイルです。 Windows Azure BLOB ストレージ サービスに格納できる BLOB には、ブロック BLOB とページ BLOB の 2 種類があります。 SQL Server バックアップでは、BLOB の種類としてページ BLOB を使用します。 BLOB は、次の URL 形式を使用してアドレス指定が可能です: https://<ストレージ アカウント>.blob.core.windows. net/<コンテナー>/<BLOB>

Azure BLOB ストレージ

Windows Azure BLOB ストレージ サービスの詳細については、「.NET で Windows Azure BLOB ストレージ サービスを使用する方法」を参照してください。

ページ BLOB の詳細については、「ブロック BLOB およびページ BLOB について」を参照してください。

SQL Server のコンポーネント

URL: 一意なバックアップ ファイルの Uniform Resource Identifier (URI) を示します。 URL は、SQL Server バックアップ ファイルの場所と名前を指定するために使用されます。 この実装で有効な URL は、Windows Azure ストレージ アカウントでページ BLOB を指す URL のみです。 URL は、コンテナーだけでなく、実際の BLOB を指している必要があります。 BLOB が存在しない場合は作成されます。 既存の BLOB を指定した場合、BACKUP ステートメントは "WITH FORMAT" オプションが指定されていなければ失敗します。

注記注意

バックアップ ファイルをコピーして Windows Azure BLOB ストレージ サービスにアップロードする場合は、ストレージ オプションとしてページ BLOB を使用してください。 ブロック BLOB からの復元はサポートされていません。 ブロック BLOB から RESTORE ステートメントを実行すると、エラーが発生して失敗します。

サンプル URL 値を次に示します: http [s]: //ACCOUNTNAME.Blob.core.windows. net/<コンテナー>/<ファイル名.bak>。 HTTPS は必須ではありませんが、推奨されています。

資格情報: SQL Server 資格情報は、SQL Server の外部にあるリソースへの接続に必要な認証情報を保存するために使用されるオブジェクトです。 ここでは、SQL Server のバックアップおよび復元プロセスで資格情報を使用して、Windows Azure BLOB ストレージ サービスを認証します。 資格情報には、ストレージ アカウントの名前とそのアクセス キー値が格納されます。 作成した資格情報は、BACKUP/RESTORE ステートメントの実行時に WITH CREDENTIAL オプションで指定する必要があります。 ストレージ アカウントの access keys を表示、コピー、または再生成する方法の詳細については、「Windows Azure ストレージ アカウントのアクセス キーを表示、コピー、および再生成する方法」を参照してください。

SQL Server 資格情報を作成する詳細な手順については、このトピックの「資格情報の作成」の例を参照してください。

資格情報の全般的な情報については、「資格情報」を参照してください。

資格情報が使用されるその他の例については、「SQL Server エージェント プロキシの作成」参照してください。

制限事項

  • サポートされるバックアップの最大サイズは 1 TB です。

  • この実装では、TSQL または SMO を使用してバックアップ ステートメントや復元ステートメントを実行できます。 現在、SQL Server Management Studio のバックアップと復元ウィザードを使用して、Windows Azure BLOB ストレージ サービスとの間でバックアップまたは復元を実行することはできません。

  • 論理デバイス名の作成はサポートされていません。 そのため、sp_dumpdevice または SQL Server Management Studio を使用してバックアップ デバイスとして URL を追加することはできません。

  • 既存のバックアップ BLOB への追加はサポートされていません。 既存の BLOB へのバックアップは WITH FORMAT オプションを使用した場合にのみ上書きできます。

  • 1 回のバックアップ操作で複数の BLOB にバックアップすることはサポートされていません。 たとえば、次のコードではエラーが返されます。

    BACKUP DATABASE AdventureWorks2012 
    TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_1.bak' 
       URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_2.bak' 
          WITH CREDENTIAL = 'mycredential' 
         ,STATS = 5;
    GO 
    
  • BACKUP ステートメントでブロック サイズを指定することはサポートされていません。

  • MAXTRANSFERSIZE を指定することはサポートされていません。

  • バックアップセットのオプション (RETAINDAYS および EXPIREDATE) を指定することはサポートされていません。

  • SQL Server では、バックアップ デバイス名に最大 259 文字の制限があります。 BACKUP TO URL では、URL の指定に使用する必須要素に ‘https://.blob.core.windows.net//.bak’ の 36 文字が使用されるため、 アカウント、コンテナー、および BLOB の名前は残りの 223 文字で構成します。

BACKUP/RESTORE ステートメントのサポート

BACKUP/RESTORE ステートメント

サポート対象

例外

コメント

BACKUP

BLOCKSIZE および MAXTRANSFERSIZE はサポートされていません。

WITH CREDENTIAL を指定する必要があります

RESTORE

WITH CREDENTIAL を指定する必要があります

RESTORE FILELISTONLY

WITH CREDENTIAL を指定する必要があります

RESTORE HEADERONLY

WITH CREDENTIAL を指定する必要があります

RESTORE LABELONLY

WITH CREDENTIAL を指定する必要があります

RESTORE VERIFYONLY

WITH CREDENTIAL を指定する必要があります

RESTORE REWINDONLY

BACKUP ステートメントの構文と一般的な情報については、「BACKUP (Transact-SQL)」を参照してください。

RESTORE ステートメントの構文と一般的な情報については、「RESTORE (Transact-SQL)」を参照してください。

BACKUP の引数のサポート

引数

サポート対象

例外

コメント

DATABASE

LOG

TO (URL)

DISK および TAPE とは異なり、URL では論理名の指定と作成はサポートされていません。

この引数は、バックアップ ファイルの URL パスの指定に使用されます。

MIRROR TO

WITH オプション:

CREDENTIAL

WITH CREDENTIAL は、BACKUP TO URL オプションを使用して Windows Azure BLOB ストレージ サービスにバックアップする場合にのみ使用できます。

DIFFERENTIAL

COPY_ONLY

COMPRESSION|NO_COMPRESSION

DESCRIPTION

NAME

EXPIREDATE | RETAINDAYS

NOINIT | INIT

このオプションは使用しても無視されます。

BLOB に追加することはできません。 バックアップを上書きするには、FORMAT 引数を使用します。

NOSKIP | SKIP

NOFORMAT | FORMAT

このオプションは使用しても無視されます。

WITH FORMAT を指定した場合を除き、既存の BLOB に対して実行されるバックアップは失敗します。 WITH FORMAT を指定すると、既存の BLOB が上書きされます。

MEDIADESCRIPTION

MEDIANAME

BLOCKSIZE

BUFFERCOUNT

MAXTRANSFERSIZE

NO_CHECKSUM | CHECKSUM

STOP_ON_ERROR | CONTINUE_AFTER_ERROR

STATS

REWIND | NOREWIND

UNLOAD | NOUNLOAD

NORECOVERY | STANDBY

NO_TRUNCATE

BACKUP の引数の詳細については、「BACKUP (Transact-SQL)」を参照してください。

RESTORE の引数のサポート

引数

サポート対象

例外

コメント

DATABASE

LOG

FROM (URL)

FROM URL 引数は、バックアップ ファイルの URL パスの指定に使用されます。

WITH オプション:

CREDENTIAL

WITH CREDENTIAL は、RESTORE FROM URL オプションを使用して Windows Azure BLOB ストレージ サービスから復元する場合にのみ使用できます。

PARTIAL

RECOVERY | NORECOVERY | STANDBY

LOADHISTORY

MOVE

REPLACE

RESTART

RESTRICTED_USER

FILE

PASSWORD

MEDIANAME

MEDIAPASSWORD

BLOCKSIZE

BUFFERCOUNT

MAXTRANSFERSIZE

CHECKSUM | NO_CHECKSUM

STOP_ON_ERROR | CONTINUE_AFTER_ERROR

FILESTREAM

STATS

REWIND | NOREWIND

UNLOAD | NOUNLOAD

KEEP_REPLICATION

KEEP_CDC

ENABLE_BROKER | ERROR_BROKER_CONVERSATIONS | NEW_BROKER

STOPAT | STOPATMARK | STOPBEFOREMARK

RESTORE の引数の詳細については、「RESTORE の引数 (Transact-SQL)」を参照してください。

使用例

ここでは、次の例について説明します。

  • 資格情報の作成

  • データベース全体をバックアップする

  • データベースおよびログをバックアップする

  • プライマリ ファイル グループのファイル全体のバックアップを作成する

  • プライマリ ファイル グループのファイルの差分バックアップを作成する

  • データベースを復元しファイルを移動する

  • STOPAT を使って特定の時点の状態に復元する

資格情報の作成

次の例では、Windows Azure ストレージの認証情報を格納する資格情報を作成します。

  1. TSQL

    IF NOT EXISTS
    (SELECT * FROM sys.credentials 
    WHERE credential_identity = 'mycredential')
    CREATE CREDENTIAL mycredential WITH IDENTITY = 'mystorageaccount'
    ,SECRET = '<storage access key>' ;
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    string secret = "<storage access key>";
    
    // Create a Credential
    string credentialName = "mycredential";
    Credential credential = new Credential(server, credentialName);
    credential.Create(identity, secret);
    
  3. PowerShell

    # create variables
    $storageAccount = "mystorageaccount"
    $storageKey = "<storage access key>"
    $secureString = convertto-securestring $storageKey  -asplaintext -force
    $credentialName = "mycredential"
    
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # Create a credential
     New-SqlCredential -Name $credentialName -Path $srvpath -Identity $storageAccount -Secret $secureString
    

データベース全体をバックアップする

次の例では、AdventureWorks2012 データベースを Windows Azure BLOB ストレージ サービスにバックアップします。

  1. TSQL

    BACKUP DATABASE AdventureWorks2012 
    TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak' 
          WITH CREDENTIAL = 'mycredential' 
         ,COMPRESSION
         ,STATS = 5;
    GO 
    
  1. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.CompressionOption = BackupCompressionOptions.On;
    backup.Devices.AddDevice(url, DeviceType.Url);
    backup.SqlBackup(server);
    
  2. PowerShell

    # create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME" 
    # for default instance, the $srvpath varilable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to SQL Server Instance
    CD $srvPath 
    $backupFile = $backupUrlContainer + "AdventureWorks2012" +  ".bak"
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On   
    

データベースおよびログをバックアップする

次の例では、AdventureWorks2012 サンプル データベースをバックアップします。このデータベースでは、既定で単純復旧モデルが使用されています。 ここではまず、ログをバックアップするため、完全復旧モデルを使用するよう AdventureWorks2012 データベースを変更します。 その後、Windows Azure BLOB にデータベースの完全バックアップを作成し、更新操作の期間後、ログをバックアップします。 この例では、日付と時刻のタイム スタンプを含むバックアップ ファイル名を作成します。

  1. TSQL

    -- To permit log backups, before the full database backup, modify the database 
    -- to use the full recovery model.
    USE master;
    GO
    ALTER DATABASE AdventureWorks2012
       SET RECOVERY FULL;
    GO
    
    
    -- Back up the full AdventureWorks2012 database.
           -- First create a file name for the backup file with DateTime stamp
    
    DECLARE @Full_Filename AS VARCHAR (300);
    SET @Full_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Full_'+ 
    REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.bak'; 
    --Back up Adventureworks2012 database
    
    BACKUP DATABASE AdventureWorks2012
    TO URL =  @Full_Filename
    WITH CREDENTIAL = 'mycredential';
    ,COMPRESSION
    GO
    -- Back up the AdventureWorks2012 log.
    DECLARE @Log_Filename AS VARCHAR (300);
    SET @Log_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Log_'+ 
    REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.trn';
    BACKUP LOG AdventureWorks2012
     TO URL = @Log_Filename
    WITH CREDENTIAL = 'mycredential'
    ,COMPRESSION;
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    
    // Generate Unique Url for data backup
    string urlDataBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}_Data-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup Database to Url
    Backup backupData = new Backup();
    backupData.CredentialName = credentialName;
    backupData.Database = dbName;
    backup.CompressionOption = BackupCompressionOptions.On;
    backupData.Devices.AddDevice(urlDataBackup, DeviceType.Url);
    backupData.SqlBackup(server);
    
    // Generate Unique Url for data backup
    string urlLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}_Log-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup Database Log to Url
    Backup backupLog = new Backup();
    backupLog.CredentialName = credentialName;
    backupLog.Database = dbName;
    backup.CompressionOption = BackupCompressionOptions.On;
    backupLog.Devices.AddDevice(urlLogBackup, DeviceType.Url);
    backupLog.Action = BackupActionType.Log;
    backupLog.SqlBackup(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to theSQL Server Instance
    
    CD $srvPath 
    #Create a unique file name for the full database backup
    $backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    #Backup Database to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Database  
    
    #Create a unique file name for log backup
    
    $backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".trn"
    
    #Backup Log to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Log  
    

プライマリ ファイル グループのファイル全体のバックアップを作成する

次の例では、プライマリ ファイル グループのファイル全体のバックアップを作成します。

  1. TSQL

    --Back up the files in Primary:
    BACKUP DATABASE AdventureWorks2012
       FILEGROUP = 'Primary'
       TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012files.bck'
       WITH CREDENTIAL = 'mycredential'
       ,COMPRESSION;
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bck",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Action = BackupActionType.Files;
    backup.DatabaseFileGroups.Add("PRIMARY");
    backup.CompressionOption = BackupCompressionOptions.On;
    backup.Devices.AddDevice(url, DeviceType.Url);
    backup.SqlBackup(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to the SQL Server Instance
    
    CD $srvPath 
    #Create a unique file name for the file backup
    $backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bck"
    
    #Backup Primary File Group to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Files -DatabaseFileGroup Primary  
    

プライマリ ファイル グループのファイルの差分バックアップを作成する

次の例では、プライマリ ファイル グループのファイルの差分バックアップを作成します。

  1. TSQL

    --Back up the files in Primary:
    BACKUP DATABASE AdventureWorks2012
       FILEGROUP = 'Primary'
       TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012filesdiff.bck'
       WITH 
          CREDENTIAL = 'mycredential'
          ,COMPRESSION
      ,DIFFERENTIAL;
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    
    // Generate Unique Url
    string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Action = BackupActionType.Files;
    backup.DatabaseFileGroups.Add("PRIMARY");
    backup.Incremental = true;
    backup.CompressionOption = BackupCompressionOptions.On;
    backup.Devices.AddDevice(url, DeviceType.Url);
    backup.SqlBackup(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to SQL Server Instance
    
    CD $srvPath 
    
    #create a unique file name for the full backup
    $backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    #Create a differential backup of the primary filegroup
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName -CompressionOption On -BackupAction Files -DatabaseFileGroup Primary -Incremental  
    

データベースを復元しファイルを移動する

データベースの完全バックアップを復元し、復元したデータベースを C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data ディレクトリに移動するには、次の手順を実行します。

  1. TSQL

    -- Backup the tail of the log first
    
    DECLARE @Log_Filename AS VARCHAR (300);
    SET @Log_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Log_'+ 
    REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.trn';
    BACKUP LOG AdventureWorks2012
     TO URL = @Log_Filename
    WITH CREDENTIAL = 'mycredential'
    ,NORECOVERY;
    GO
    
    RESTORE DATABASE AdventureWorks2012 FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak'
    WITH CREDENTIAL = 'mycredential'
    ,MOVE 'AdventureWorks2012_data' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf'
    ,MOVE 'AdventureWorks2012_log' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf'
          ,STATS = 5 
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string urlBackupData = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-Data{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Devices.AddDevice(urlBackupData, DeviceType.Url);
    backup.SqlBackup(server);
    
    // Generate Unique Url for tail log backup
    string urlTailLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-TailLog{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup Tail Log to Url
    Backup backupTailLog = new Backup();
    backupTailLog.CredentialName = credentialName;
    backupTailLog.Database = dbName;
    backupTailLog.Action = BackupActionType.Log;
    backupTailLog.NoRecovery = true;
    backupTailLog.Devices.AddDevice(urlTailLogBackup, DeviceType.Url);
    backupTailLog.SqlBackup(server);
    
    // Restore a database and move files
    string newDataFilePath = server.MasterDBLogPath  + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".mdf";
    string newLogFilePath = server.MasterDBLogPath  + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".ldf";
    
    Restore restore = new Restore();
    restore.CredentialName = credentialName;
    restore.Database = dbName;
    restore.ReplaceDatabase = true;
    restore.Devices.AddDevice(urlBackupData, DeviceType.Url);
    restore.RelocateFiles.Add(new RelocateFile(dbName, newDataFilePath));
    restore.RelocateFiles.Add(new RelocateFile(dbName+ "_Log", newLogFilePath));
    restore.SqlRestore(server); 
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTNACENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # navigate to SQL Server Instance 
    
    CD $srvPath 
    
    #create a unique file name for the full backup
    $backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    # Full database backup to URL
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupdbFile  -SqlCredential $credentialName -CompressionOption On    
    
    #Create a unique file name for the tail log backup
    $backuplogFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".trn"
    
    #Backup tail log to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName  -BackupAction Log -NoRecovery  
    
    # Restore Database and move files
    
    $newDataFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile ("AdventureWorks_Data","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf")
    $newLogFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("AdventureWorks_Log","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf")
    
    Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backupdbFile -RelocateFile @($newDataFilePath,$newLogFilePath)  
    

STOPAT を使って特定の時点の状態に復元する

次の例では、データベースを特定の時点の状態に復元し、復元操作を示します。

  1. TSQL

    RESTORE DATABASE AdventureWorks FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak' 
    WITH 
     CREDENTIAL = 'mycredential'
    ,MOVE 'AdventureWorks2012_data' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf'
    ,Move 'AdventureWorks2012_log' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf'
    ,NORECOVERY
    --,REPLACE
    ,STATS = 5;
    GO 
    
    RESTORE LOG AdventureWorks FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.trn' 
    WITH CREDENTIAL = 'mycredential'
    ,RECOVERY 
    ,STOPAT = 'Oct 23, 2012 5:00 PM' 
    GO
    
  2. C#

    // Connect to default sql server instance on local machine
    Server server = new Server(".");
    string identity = "mystorageaccount";
    
    string credentialName = "mycredential";
    string dbName = "AdventureWorks2012";
    string blobContainerName = "mycontainer";
    
    // Generate Unique Url
    string urlBackupData = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-Data{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup to Url
    Backup backup = new Backup();
    backup.CredentialName = credentialName;
    backup.Database = dbName;
    backup.Devices.AddDevice(urlBackupData, DeviceType.Url);
    backup.SqlBackup(server);
    
    // Generate Unique Url for Tail Log backup
    string urlTailLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-TailLog{3}.bak",
            identity,
            blobContainerName,
            dbName,
            DateTime.Now.ToString("s").Replace(":", "-"));
    
    
    // Backup Tail Log to Url
    Backup backupTailLog = new Backup();
    backupTailLog.CredentialName = credentialName;
    backupTailLog.Database = dbName;
    backupTailLog.Action = BackupActionType.Log;
    backupTailLog.NoRecovery = true;
    backupTailLog.Devices.AddDevice(urlTailLogBackup, DeviceType.Url);
    backupTailLog.SqlBackup(server);
    
    // Restore a database and move files
    string newDataFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".mdf";
    string newLogFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".ldf";
    
    Restore restore = new Restore();
    restore.CredentialName = credentialName;
    restore.Database = dbName;
    restore.ReplaceDatabase = true;
    restore.NoRecovery = true;
    restore.Devices.AddDevice(urlBackupData, DeviceType.Url);
    restore.RelocateFiles.Add(new RelocateFile(dbName, newDataFilePath));
    restore.RelocateFiles.Add(new RelocateFile(dbName + "_Log", newLogFilePath));
    restore.SqlRestore(server);
    
    // Restore transaction Log with stop at 
    Restore restoreLog = new Restore();
    restoreLog.CredentialName = credentialName;
    restoreLog.Database = dbName;
    restoreLog.Action = RestoreActionType.Log;
    restoreLog.Devices.AddDevice(urlBackupData, DeviceType.Url);
    restoreLog.ToPointInTime = DateTime.Now.ToString(); 
    restoreLog.SqlRestore(server);
    
  3. PowerShell

    #create variables
    $backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
    $credentialName = "mycredential"
    $srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
    # for default instance, the $srvpath variable would be \"SQLSERVER:\SQL\COMPUTERNAME\DEFAULT\"
    
    # Navigate to SQL Server Instance Directory
    
    CD $srvPath 
    
    #create a unique file name for the full backup
    $backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".bak"
    
    # Full database backup to URL
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupdbFile  -SqlCredential $credentialName -CompressionOption On   
    
    #Create a unique file name for the tail log backup
    $backuplogFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") +  ".trn"
    
    #Backup tail log to URL
    
    Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile  -SqlCredential $credentialName  -BackupAction Log -NoRecovery   
    
    # Restore Database and move files
    
    $newDataFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile ("AdventureWorks_Data","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf")
    $newLogFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("AdventureWorks_Log","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf")
    
    Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backupdbFile -RelocateFile @($newDataFilePath,$newLogFilePath) -NoRecovery  
    
    # Restore Transaction log with Stop At:
    Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backuplogFile  -ToPointInTime (Get-Date).ToString()