Consulta outro grupo de clusters do SQL server?

2

Existe uma maneira de consultar do SQL Server no TSQL qual nó está ativo em outro grupo de cluster no mesmo cluster?

Eu tenho um cluster com dois grupos de clusters, um com recursos para o SQL Server, um com recursos para o aplicativo que se conecta ao SQL Server. Para enviar alertas do SQL Server, preciso descobrir qual nó está ativo no grupo de aplicativos. Existe uma maneira de fazer isso no TSQL? Eu posso descobrir o nome do nó SQL ativo.

    
por Andrew J. Brehm 03.02.2012 / 11:55

2 respostas

1

A partir do SQL Server 2008 R2 SP1, isso é bom e fácil, você pode consultar o DMV dm_server_services e procurar o serviço em cluster:

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

Versões anteriores do SQL Server, talvez você precise fazer algo como ler o registro, o que pode ser feito usando o seguinte código:

declare @dir nvarchar(20)
exec xp_regread
N'HKEY_LOCAL_MACHINE',
N'SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName',
N'ComputerName',
@dir OUTPUT
select @dir

Editar:

Para obter informações sobre em qual nó um grupo de recursos de cluster está sendo executado, é necessário usar o WMI, o seguinte código do PowerShell retornará o nó do cluster no qual o grupo especificado está atualmente ativo, como para fazer isso via T-SQL. , você poderia tanto fazer isso usando xp_cmdshell, ou criar uma tabela em seu banco de dados para armazenar esse valor, acrescentar um pouco de código ao PowerShell para fazer com que ele atualize o valor na tabela toda vez que ele for executado e executá-lo como um trabalho do agente SQL do powershell:

$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)

Também seria bastante trivial regravar isso em C # e criar uma função CLR do servidor SQL que aceite os parâmetros de um computador para executar a consulta e o grupo para verificar e, em seguida, retornar o nome do servidor.

Espero que isso ajude, pelo menos, a colocar você no caminho.

    
por 20.12.2012 / 14:18
1

Se você tem o xp_cmdshell ativado, é bem simples. Basta usar o xp_cmdshell para iniciar o comando "cluster" do 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
    
por 20.12.2012 / 21:02