SE の雑記

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

Azure ストレージに DB バックアップを取得する際に他処理連携を考慮したステータスファイルを作成

leave a comment

Azure ストレージに取得したバックアップはストレージアカウントの情報が使用できれば、他の環境からも利用できますので、サーバー間の DB コピー等で利用することができます。

ベースとなるサーバーで DB バックアップ中に他サーバーからバックアップを利用する処理が実行されると、リストアに失敗するかと思いますので、バックアップ中を示す、ステータスファイルを作成するサンプルを書いてみました。

作成にあたって我らが TaaS 先輩の記事を熟読させていいただきました。
さすが、TaaS、今後 SQL Server にも手を伸ばすそうなので、胸の高鳴りが止まりません。
PowerShell で Windows Azure Blobストレージ へファイルをアップロードする

今回は SQL Server PowerShell のコマンドレットを使用してバックアップを取得していますが、こちらについては
PowerShell の使用による Windows Azure BLOB ストレージ サービスへの複数データベースのバックアップ
が参考になります。

SQL Server 2012 SP1 CU2 以降の環境であれば、「Backup-SqlDatabase」で「BackupContainer」が指定できるようになり、コマンドレットから Azure ストレージにバックアップを作成できます。
ファイル名については自動的に生成されるようで、サーバー名 / 日付が付与されたユニークなファイルでバックアップが取得されるようです。

作成したサンプルがこちらになります

Import-Module sqlps -DisableNameChecking
$ComputerName = $env:COMPUTERNAME
$StorageAccount = "ストレージアカウント"
$StorageAccountKey = "ストレージアカウントキー"
$Protocol = "https"
$StorageCredential = "DefaultEndpointsProtocol={0};AccountName={1};AccountKey={2}" -f $Protocol,$StorageAccount,$StorageAccountKey
$blobContainer = "sqlbackup"
$StorageURL = "https://$storageAccount.blob.core.windows.net"
$backupUrlContainer = "$StorageURL/$blobContainer/"
$credentialName = "StorageAccount"
$BackupDB = "バックアップ対象DB"
# BLOB クライアントの生成
Add-Type -Path "C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Storage\Microsoft.WindowsAzure.Storage.dll"
$blobcredential = [Microsoft.WindowsAzure.Storage.CloudStorageAccount]::Parse($StorageCredential)
$blobClient = $blobcredential.CreateCloudBlobClient()
# バックアップ用のコンテナーにアクセス
$container = $blobClient.GetContainerReference($blobContainer)
# バックアップ取得中のステータスファイルを作成
$blob = $container.GetBlockBlobReference($ComputerName+ "_" + "$BackupDB.status")
$blob.UploadText(("{0} backup status file:{1}" -f $BackupDB, (Get-Date)))
Backup-SqlDatabase -Database $BackupDB -path "sqlserver:\sql\$ComputerName\DEFAULT" -BackupContainer  $backupUrlContainer -Compression On -Checksum On -SqlCredential $credentialName
# バックアップ完了時にステータスファイルを削除
$blob.Delete()

 

Microsoft Azure Storage Client Library 1.7 以前の場合は、以下のようなコードを使用して BLOB クライアントを生成していたのですが、現状のバージョンでは上記のように使用するクラスが変わっています。

Storage Client Library Reference

Add-Type -Path "C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.3\bin\Microsoft.WindowsAzure.StorageClient.dll"
$credential = New-Object Microsoft.WindowsAzure.StorageCredentialsAccountAndKey($StorageAccount,$StorageAccountKey)
$blobClient = New-Object Microsoft.WindowsAzure.StorageClient.CloudBlobClient($StorageURL,  $credential)

 

BLOB クライアントを使用して、バックアップ取得前にファイルを作成 / バックアップ取得後にファイルを削除しています。

バックアップ中はステータスファイルが存在した状態となりますので、このステータスファイルの存在を確認すれば、バックアップ中かの判断が可能になるかと。

Azure PowerShell では Set-AzureStorageBlobContent というファイルをアップロードするためのコマンドレット (CloudBlockBlob.UploadFromFile 相当) は提供されているのですが、ファイルを作成せずにテキストを書き込むためのメソッド (CloudBlockBlob.UploadText 相当) が提供されていないため、ファイルを作成せずにステータスファイルを作成することが標準のコマンドレットではできないので、ファイルを作成しない場合には .NET のクラスを直接使用する必要が出てきます。

# 一時ファイルの作成方法については PowerTip: Use PowerShell to Create Temporary File Name が参考になります。

Share

Written by Masayuki.Ozawa

3月 26th, 2015 at 8:28 am

Posted in SQL Server

Tagged with

Leave a Reply