Есть ли способ запросить с SQL Server в TSQL, какой узел активен в другой группе кластера в том же кластере?
У меня есть кластер с двумя группами кластеров, одна с ресурсами для SQL Server, другая с ресурсами для приложения, подключающегося к SQL Server. Чтобы отправлять предупреждения от SQL Server, мне нужно выяснить, какой узел активен в группе приложений. Есть ли способ сделать это в TSQL? Я могу узнать имя активного узла SQL.
Что касается SQL Server 2008 R2 SP1, это удобно и просто, вы можете просто запросить DMV dm_server_services и найти кластерную службу:
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 # и создать функцию CLR SQL-сервера, которая принимает параметры компьютера для выполнения запроса и группы для проверки, а затем возвращает имя сервера.
Надеюсь, это поможет, по крайней мере, встать на путь.
Если у вас включен 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