有没有办法以编程方式确定 SQL Server 故障转移群集中的哪个节点是活动节点?或者至少确定当前机器是否是活动节点?
我有一个 Windows 程序,它在故障转移群集中的两个物理节点上运行,但它的运行方式应该不同,具体取决于它是否在活动节点上运行。部分原因是该程序不应同时在非活动节点和活动节点上运行。
(我已经读过一些关于让程序集群感知的内容,但这对于这个简单的场景来说似乎太过分了。)
有没有办法以编程方式确定 SQL Server 故障转移群集中的哪个节点是活动节点?或者至少确定当前机器是否是活动节点?
我有一个 Windows 程序,它在故障转移群集中的两个物理节点上运行,但它的运行方式应该不同,具体取决于它是否在活动节点上运行。部分原因是该程序不应同时在非活动节点和活动节点上运行。
(我已经读过一些关于让程序集群感知的内容,但这对于这个简单的场景来说似乎太过分了。)
从 SQL 服务器:
Select ServerProperty('ComputerNamePhysicalNetBIOS')
您还可以通过 Microsoft.SqlServer.Management.Smo 命名空间访问它,如下所示。
你可以这样检查:
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