我在SQL Server 2014中运行SQL Server代理作业,它有" Always On"启用。
主服务器:A 辅助服务器:B
我们遇到了一种情况,服务器A遇到了网络问题,所以"永远在线"功能自动将主服务器切换到B. 在这种情况下,我们的作业在服务器A中运行,因此它已经失败,因为服务器A进入只读模式。
有没有办法自动执行SQL Server代理作业而无需使用"始终打开"
的任何人工干预答案 0 :(得分:1)
您可以在两个实例,主副本副本上创建作业,然后在作业的第一步中使用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年,您可以检查第一步的一些sys视图。
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