如何使用 "Always On" 在 SQL 服务器代理作业中自动进行故障转移
How to automate the failover in SQL Sever Agent Jobs with "Always On"
我是 运行 SQL SQL Server 2014 中的服务器代理作业,它已启用 "Always On"。
主服务器:A
副服务器:B
我们遇到一种情况,服务器 A 出现网络问题,因此 "Always on" 功能自动将主服务器切换到 B。
在这种情况下,我们的作业是服务器 A 中的 运行,因此由于服务器 A 进入只读模式而失败。
有没有一种方法可以使用 "Always on"
自动执行 SQL 服务器代理作业而无需任何手动干预
您可以在主副本和辅助副本这两个实例上执行作业,然后在作业的第一步中使用 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
我是 运行 SQL SQL Server 2014 中的服务器代理作业,它已启用 "Always On"。
主服务器:A 副服务器:B
我们遇到一种情况,服务器 A 出现网络问题,因此 "Always on" 功能自动将主服务器切换到 B。 在这种情况下,我们的作业是服务器 A 中的 运行,因此由于服务器 A 进入只读模式而失败。
有没有一种方法可以使用 "Always on"
自动执行 SQL 服务器代理作业而无需任何手动干预您可以在主副本和辅助副本这两个实例上执行作业,然后在作业的第一步中使用 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