SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure ストレージに作成したステータスファイルを利用したリストアの実行

leave a comment

先日投稿した、Azure ストレージに DB バックアップを取得する際に他処理連携を考慮したステータスファイルを作成 のステータスファイルを使用したリストアのサンプルを書いてみたいと思います。

作成したサンプルが以下になります。

Import-Module SQLPS -DisableNameChecking

$Database = "<データベース名>"
$MaxRetryCount = "10"

$ComputerName = $ENV:COMPUTERNAME

$StorageAccountName = "<ストレージアカウント名>"
$StorageAccountKey = "<ストレージアカウントキー>"

$BackupContainer = "<コンテナー名>"
$CredentialName = "<SQL Server に設定したストレージアカウントの資格情報>"

$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey 

$StatusFileName = "{0}*{1}.status" -f $ComputerName,$Database
$BackupFileName = "{0}*{1}*.bak" -f $ComputerName,$Database

for($RetryCount = 1;$RetryCount -le $MaxRetryCount;$RetryCount++){
    $StorageFile = Get-AzureStorageBlob -Container $BackupContainer -Context $context

    If(($StorageFile | ? Name -like  $StatusFileName) -ne $null){
        Write-Output "Status File Exists. Wait...."
        Start-Sleep 5   
    }else{
        $BackupFile = $StorageFile | ? Name -Like $BackupFileName | Sort-Object LastModified -Descending | SELECT -First 1
        break
    }
}
If ($RetryCount -gt $MaxRetryCount){
    Throw "Max Retry Error"
}

$SQL = @"
ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE [TEST] FROM  URL = N'https://{1}.blob.core.windows.net/{2}/{3}' WITH  CREDENTIAL = N'{4}' ,  NOUNLOAD,  REPLACE,  STATS = 10
ALTER DATABASE [{0}] SET MULTI_USER
"@ -f $Database, $StorageAccountName, $BackupContainer, $BackupFile.Name, $CredentialName

Invoke-Sqlcmd -Database "master" -Query $SQL

 

ステータスファイルが存在している場合は、一定回数確認を試行し、ステータスファイルが存在しない場合には、リストアを実行しています。

「Restore-SQLDatabase」コマンドレットを使用していない理由としては、このコマンドレットには、「接続先データベースへの既存の接続を閉じる」のオプション相当の動作が見当たらなったため、通常の SQL を実行することでリストアを実行しています。

このクエリであれば、リストア対象の DB に接続があった場合も強制的に切断をしてリストアを実施することができるかと。

Azure ストレージ上に保存されたバックアップは、ストレージアカウントの情報がわかれば利用することができますので、同一の DB を使用したい環境を作りたい場合にはいろいろと利用できるかと。

Written by masayuki.ozawa

3月 29th, 2015 at 12:14 pm

Posted in SQL Server

Tagged with

Leave a Reply

*