如何使用"Always On"在 SQL 服务器代理作业中自动执行故障转移



我在SQL Server2014中运行SQL Server Agent Jobs,它启用了"Always On"。

主服务器:A 辅助服务器:B

我们遇到了一种情况,服务器 A 有网络问题,因此"始终打开"功能自动将主服务器切换到 B。 在这种情况下,我们的作业在服务器 A 中运行,因此由于服务器 A 进入只读模式,因此它已失败。

有没有办法使用"始终打开"自动执行SQL Server代理作业,而无需任何手动干预

您可以在主副本和辅助副本这两个实例上拥有作业,然后在作业的第一步中使用sys.fn_hadr_is_primary_replica

IF sys.fn_hadr_is_primary_replica ( 'yourDBname' ) <> 1   
BEGIN  
-- raiserror, so the job step fails and the entire job fails
-- sometimes you may want to set this job to "finish with success" when this step fails
-- so that you don't get alerts
declare @errMsg varchar(600) = 'This is meant to run on the primary replica'
raiserror(@errMsg,16,1)
END
ELSE
BEGIN  
print 'This is the primary replica, continue with the job'
END

这将适用于2014+。对于 2012,您可以检查一些系统视图作为第一步。

IF EXISTS(SELECT
AGC.name -- Availability Group
, RCS.replica_server_name -- SQL cluster node name
, ARS.role_desc  -- Replica Role
, AGL.dns_name  -- Listener Name
FROM
sys.availability_groups_cluster AS AGC
LEFT JOIN sys.dm_hadr_availability_replica_cluster_states AS RCS
ON RCS.group_id = AGC.group_id
LEFT JOIN sys.dm_hadr_availability_replica_states AS ARS
ON ARS.replica_id = RCS.replica_id
LEFT JOIN sys.availability_group_listeners AS AGL
ON AGL.group_id = ARS.group_id
WHERE
RCS.replica_server_name = @@SERVERNAME
and ARS.role_desc = 'PRIMARY')
BEGIN
print 'Continue with job'
END
ELSE
BEGIN
declare @errMsg varchar(600) = 'This is meant to run on the primary replica'
raiserror(@errMsg,16,1)
END

最新更新