Отказоустойчивый кластер SQL Server - определить активный узел - PullRequest
5 голосов
/ 20 декабря 2010

Есть ли способ программно определить, какой узел в отказоустойчивом кластере SQL Server является активным узлом ?Или хотя бы определить, является ли текущий компьютер активным узлом?

У меня есть программа Windows, которая выполняется на обоих физических узлах в отказоустойчивом кластере, но она должна работать по-разному в зависимости от того, работает ли она на активном узле., Частично причина в том, что эта программа не должна запускаться одновременно на неактивном и активном узле .

(я немного читал об информировании кластера программ, но, похоже, это сильноперебор для этого простого сценария.)

Ответы [ 2 ]

9 голосов
/ 20 декабря 2010

Из SQL Server:

Select ServerProperty('ComputerNamePhysicalNetBIOS')

Вы также можете получить к нему доступ через пространство имен Microsoft.SqlServer.Management.Smo, как показано здесь .

0 голосов
/ 13 декабря 2018

Вы можете проверить так:

1. Проверить статус группы доступности:

if (select
        ars.role_desc
    from sys.dm_hadr_availability_replica_states ars
    inner join sys.availability_groups ag
    on ars.group_id = ag.group_id
    where ag.name = 'AvailabilityGroupName'
    and ars.is_local = 1) = 'PRIMARY'
begin
    -- this server is the primary replica, do something here
end
else
begin
    -- this server is not the primary replica, (optional) do something here
end

* Не забудьте изменить AvailabilityGroupName

или

2. запретить выполнение задания на вторичном:

IF master.dbo.svf_AgReplicaState('AvailabilityGroupName')=0  raiserror ('This is not the primary replica.',2,1) 

или

3. проверить наличие записи на вторичном:

IF (SELECT CONVERT(sysname,DatabasePropertyEx(DB_NAME(),'Updateability'))) != 'READ_ONLY'
BEGIN

-- this server is the primary replica, do something here

END 

или

4. для SQL2014 и новее:

IF master.dbo.fn_hadr_database_is_primary_replica('Admin') = 1
    BEGIN 
        -- this server is the primary replica, do something here
    END
ELSE 
    BEGIN 
        -- this server is not the primary replica, (optional) do something here
    END 
...