先日投稿した、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 を使用したい環境を作りたい場合にはいろいろと利用できるかと。