有没有办法从 TSQL 中的 SQL Server 查询同一个集群中另一个集群组中哪个节点处于活动状态?
我有一个集群,其中有两个集群组,一个包含 SQL Server 资源,另一个包含连接到 SQL Server 的应用程序资源。为了从 SQL Server 发送警报,我需要找出应用程序组中哪个节点处于活动状态。有没有办法在 TSQL 中做到这一点?我可以找出活动 SQL 节点的名称。
答案1
从 SQL Server 2008 R2 SP1 开始,这非常简单,您只需查询 dm_server_services DMV 并查找集群服务:
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 执行此操作,或者在您的数据库中创建一个表来存储该值,在 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# 重写这个并创建一个 SQL 服务器 CLR 函数也非常简单,该函数接受要运行查询的计算机的参数和要检查的组,然后返回服务器名称。
希望这至少能帮助你走上正轨。
答案2
如果你启用了 xp_cmdshell,那么就很简单了。只需使用 xp_cmdshell 启动 DOS“cluster”命令即可。
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