【问题标题】:How to automate the failover in SQL Sever Agent Jobs with "Always On"如何使用“始终开启”自动执行 SQL Server 代理作业中的故障转移
【发布时间】:2018-05-09 11:35:31
【问题描述】:

我在 SQL Server 2014 中运行 SQL Server 代理作业,它启用了“始终开启”。

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

我们遇到了一种情况,服务器 A 出现网络问题,因此“始终开启”功能自动将主服务器切换到 B。 在这种情况下,我们的作业在服务器 A 中运行,因此自从服务器 A 进入只读模式后它就失败了。

有没有一种方法可以自动执行 SQL Server 代理作业而无需使用“始终开启”进行任何手动干预

【问题讨论】:

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


    【解决方案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,您可以在第一步检查一些系统视图。

    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
    

    【讨论】:

    • 我会为你的答案投票。这是一个很好的方法,但你能告诉我在 else 部分我应该做什么。如果发生自动切换,那么显然它会转到其他部分。我不想运行两组作业,即一组在主要作业,另一组在次要作业。
    • @StackUser 我添加了一条错误消息。如果您将此添加到工作的第 1 步,它应该可以正常工作。然后,当发生故障转移时,它仍将仅在主副本上运行。
    猜你喜欢
    • 2010-11-16
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多