如何仅在 AlwaysOn 可用性组中的主副本上运行 SQL 作业?

Vla*_*sky 2 sql-server high-availability jobs

我有只需要在 AlwaysOn 可用性组上的主要副本上的 SQL 作业。最初创建作业时,ServerA 是主要的,后来 ServerB 成为主要的,因此 ServerA 上的作业失败,必须在 ServerB 上手动重新创建作业才能正常运行。

仅在 AlwaysOn 可用性组的主副本上运行作业的方法是什么?

Vla*_*sky 7

让作业仅在主节点上执行的一种简单方法是对作业进行简单检查,以验证'PRIMARY'正在执行作业时哪个节点。可以用简单的sql语句完成:

DECLARE @ServerName NVARCHAR(256)  = @@SERVERNAME 
DECLARE @RoleDesc NVARCHAR(60)

SELECT @RoleDesc = a.role_desc
    FROM sys.dm_hadr_availability_replica_states AS a
    JOIN sys.availability_replicas AS b
        ON b.replica_id = a.replica_id
WHERE b.replica_server_name = @ServerName

IF @RoleDesc = 'PRIMARY'
BEGIN
    --Logic for the job goes here
END
Run Code Online (Sandbox Code Playgroud)

现在只需在BEGINEND关键字之间放置逻辑。

就像 Aaron 在评论中指出的那样,仍然必须在所有服务器上以相同的逻辑创建作业,以确保它只在主副本上运行,而不是在辅助副本上运行。有一些脚本和工具可用于将作业从主要副本复制到次要副本。

  • 您需要澄清您需要在所有可能是主要副本的服务器上创建相同的作业。此外,您应该确保您的查询将结果限制为特定的可用性组 - 您目前可能只有一个,但是当您有多个时会发生什么?该查询不会从几行中选择任意一行吗? (4认同)