SQL Server の PowerShell では、SQL Server の PS プロバイダー経由で可用性グループの情報を取得することができます。
AlwaysOn ポリシーを使用した可用性グループの正常性の確認 (SQL Server)
SQL Server PowerShell プロバイダー
Microsoft.SqlServer.Management.Smo 名前空間
具体的には以下のようなコマンドで可用性グループの情報を取得できます。
Import-Module SQLPS -DisableNameChecking Get-ChildItem SQLSERVER:\SQL\$($ENV:COMPUTERNAME)\DEFAULT\AvailabilityGroups\AlwaysOn-AG\AvailabilityReplicas
PS プロバイダー経由で情報を取得した場合の注意点として、一度情報を取得した場合、取得された情報がキャッシュされているという点があります。
先ほど、PowerShell を実行した環境では、SQL-01 がプライマリとなっていることが確認できます。
この状態で SQL-02 にフェールオーバーをしてみます。
フェールオーバー後に先ほどの PowerShell のウィンドウで再度情報を取得してみます。
フェールオーバーを実施した後も先ほどと情報が変わっていないですね。
Get-ChildItem を実行した場合、SQL Server に対してクエリを実行して情報を取得しているのですが、2 回目の実行時にはクエリは実行されていません。
一度ウィンドウを閉じてコマンドレットを実行すると最新の情報となりますが、一度実行したセッションでは、初回実行時の結果がキャッシュされておりその情報が出力されます。
最新の情報を取得する場合には明示的にリフレッシュする必要があります。
AvailabilityGroup メソッド
先ほどのコマンドの場合は以下のように実行します。
Import-Module SQLPS -DisableNameChecking (Get-ChildItem SQLSERVER:\SQL\$($ENV:COMPUTERNAME)\DEFAULT\AvailabilityGroups\AlwaysOn-AG\AvailabilityReplicas).Refresh() Get-ChildItem SQLSERVER:\SQL\$($ENV:COMPUTERNAME)\DEFAULT\AvailabilityGroups\AlwaysOn-AG\AvailabilityReplicas
リフレッシュしたことで、最新の情報に更新され Role が「Secondary」に変更されていることが確認できますね。
PowerShell を実行したノードがプライマリロールの場合に処理を実行する場合は以下のように記述できます。
Import-Module SQLPS -DisableNameChecking (Get-ChildItem SQLSERVER:\SQL\$($ENV:COMPUTERNAME)\DEFAULT\AvailabilityGroups\AlwaysOn-AG\AvailabilityReplicas).Refresh() $MyRole = Get-ChildItem SQLSERVER:\SQL\$($ENV:COMPUTERNAME)\DEFAULT\AvailabilityGroups\AlwaysOn-AG\AvailabilityReplicas | ? Name -eq $ENV:COMPUTERNAME if ($MyRole.role -eq "Primary"){ "Primary Role:{0}" -f $ENV:COMPUTERNAME }
記事はいつも参考になっています、引き続き、読ませていただきます。
hong
1 5月 15 at 20:19
とても参考になりました、引き続き活用させていただきます。
hong
1 5月 15 at 20:33