从SQL服务器查询另一个群集组?

有没有一种方法可以从TSQL中的SQL Server查询哪个节点在同一集群中的另一个集群组中处于活动状态?

我有一个包含两个群集组的群集,一个具有SQL Server资源,一个具有连接到SQL Server的应用程序的资源。 为了从SQL Server发送警报,我需要找出哪个节点在应用程序组中处于活动状态。 TSQL有没有办法做到这一点? 我可以找出活动的SQL节点的名称。

从SQL Server 2008 R2 SP1开始,这非常简单,只需查询dm_server_services DMV并查找集群服务即可:

select cluster_nodename from [sys].[dm_server_services] where is_clustered = 'Y' 

早期版本的SQL服务器,你可能需要做一些事情,如读取registry,你可以使用下面的代码:

 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来解决这个问题,要么在数据库中创build一个表来存储这个值,在PowerShell中添加一些代码,让它在每次运行时更新表中的值,并作为PowerShell SQL代理运行工作:

 $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#中重新编写这个文件也是非常简单的,并创build一个SQL服务器CLR函数,该函数接受计算机的参数来运行查询,并检查组,然后返回服务器名称。

希望这有助于你至less得到你的方式。

如果您启用了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