TSQLのSQLServerから、同じクラスター内の別のクラスターグループでアクティブなノードを照会する方法はありますか?
2つのクラスターグループを持つクラスターがあります。1つはSQLServerのリソースを持ち、もう1つはSQLServerに接続するアプリケーションのリソースを持ちます。 SQL Serverからアラートを送信するには、アプリケーショングループでアクティブなノードを見つける必要があります。 TSQLでそれを行う方法はありますか?アクティブなSQLノードの名前を見つけることができます。
SQL Server 2008 R2 SP1の時点では、これは素晴らしく簡単です。dm_server_servicesDMVにクエリを実行して、クラスター化されたサービスを探すことができます。
select cluster_nodename from [sys].[dm_server_services] where is_clustered = 'Y'
以前のバージョンのSQLサーバーでは、レジストリの読み取りなどを行う必要がある場合があります。これは、次のコードを使用して実行できます。
declare @dir nvarchar(20)
exec xp_regread
N'HKEY_LOCAL_MACHINE',
N'SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName',
N'ComputerName',
@dir OUTPUT
select @dir
編集:
したがって、クラスターリソースグループが実行されているノードに関する情報を取得するには、WMIを使用する必要があります。次のPowerShellコードは、指定されたグループが現在アクティブになっているクラスターノードを返します。T-SQLを介してこれを行う場合は、 xp_cmdshellを使用してこれをシェルアウトするか、DBにテーブルを作成してこの値を格納し、PowerShellにコードを少し追加して、実行するたびにテーブルの値を更新し、PowerShellSQLエージェントとして実行するようにします。ジョブ:
$group = "Available Storage"
$computer = "."
$hostName = Get-WmiObject -Authentication PacketPrivacy -Impersonation Impersonate -Namespace root\MSCluster -ComputerName $computer -Class MSCluster_NodeToActiveGroup | Where-Object {$_.PartComponent -like "*$group*"} | Select-Object -ExpandProperty GroupComponent | Out-String
$hostName = $hostName.TrimStart("MSCluster_Node.Name=")
$hostName = $hostName.TrimStart()
$hostName = $hostName.TrimEnd()
Write-Host $hostName.Substring(1,$hostname.Length-2)
また、これをC#で書き直し、クエリを実行するコンピューターのパラメーターとチェックするグループを受け入れてサーバー名を返すSQLサーバーCLR関数を作成するのも簡単です。
これが少なくともあなたをあなたの道に導くのに役立つことを願っています。
Xp_cmdshellを有効にしている場合、それは非常に簡単です。 xp_cmdshellを使用して、DOSの「クラスター」コマンドを起動するだけです。
set nocount on
declare @commandtxt varchar(512),
@rc int
set @commandtxt = 'cluster group "Cluster Group Name"'
create table #output (output varchar(255) null)
insert #output exec @rc = master..xp_cmdshell @commandtxt
select * from #output where output LIKE 'Cluster Group Name%'
drop table #output