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

时间:2018-05-09 11:35:31

标签: sql-server-2012 sql-server-2014 database-administration

我在SQL Server 2014中运行SQL Server代理作业,它有" Always On"启用。

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

我们遇到了一种情况,服务器A遇到了网络问题,所以"永远在线"功能自动将主服务器切换到B. 在这种情况下,我们的作业在服务器A中运行,因此它已经失败,因为服务器A进入只读模式。

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

的任何人工干预

1 个答案:

答案 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