SE の雑記

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

PowerShell で SQL Server がバックアップ/リストア中かを取得してみる

leave a comment

PowerShell で SQL Server がバックアップ/リストア中かを取得するサンプルです。
サービスやサーバーの停止をする際に処理が実行されているかを判断するのに使えるかなと思います。

インスタンスでバックアップ/リストアが実行されているかどうかは、sys.dm_exec_requests から取得することができます。

バックアップが実行されている場合には、command が [BACKUP] [RESTORE] の要求が実行されていますので、これを取得することで、実行中かを判断することができます。
# BACKUP DATABASE / BACKUP LOG / RESTORE DATABASE / RESTORE LOG の Command が実行されます。

Invoke-SQLCmd が使用できる環境であれば SQL Server に対してクエリを実行するのも簡単ですので、以下のような PowerShell を実行すれば処理中かの判断は可能です。

$ServerInstance = ".SQL2012"
$Query = "SELECT * FROM sys.dm_exec_requests WHERE command LIKE 'BACKUP%' OR command LIKE 'RESTORE%'"
Push-Location
Import-Module SQLPS -DisableNameChecking
Pop-Location
$result = Invoke-Sqlcmd -Query $Query -ServerInstance $ServerInstance
if (@($result).Count -ne 0 ){Write-Output "Backup/Restore Running"}

 

テストをする際にはバックアップ/リストアが実行されている状態にする必要があります。

バックアップ / リストアに処理時間をかけるのはデータベースのサイズを増やすほかに DBCC FREEZE_IO を使用する方法があります。

この DBCC コマンドはアンドキュメントなコマンドなのですが、特定の DB に対しての IO を凍結することができます。

DBCC FREEZE_IO (<DB 名>)
DBCC FREEZE_IO (BACKUPTEST)

 

これを実行し、IO を凍結した後に、BACKUP / RESTORE を実行します。

BACKUP DATABASE BACKUPTEST TO DISK=N'BACKUPTEST.bak' WITH INIT,FORMAT
BACKUP LOG BACKUPTEST TO DISK=N'BACKUPTEST.trn' WITH INIT,FORMAT, COPY_ONLY

 

その状態で、sys.dm_exec_request を確認するとバックアップが実行中であることが確認できます。

image

SQL Server のインスタンスに接続はできますが、DB に対しての IO が凍結されているのでバックアップの処理が進まない状態となります。

これでバックアップ中の状態をタイミングを選ばずに取得することができます。

凍結した IO を解除するには、DBCC THAW_IO を実行します。

DBCC THAW_IO (<DB 名>)
DBCC THAW_IO (BACKUPTEST)

IOの凍結はインスタンスに接続できるが応答を返さない場合などの検証に使えますので覚えておくとよいかもしれないですね。

# 本番環境で使うことはまずないですが。

Share

Written by Masayuki.Ozawa

4月 13th, 2014 at 1:24 pm

Posted in PowerShell,SQL Server

Tagged with ,

Leave a Reply