Sql-Server-Agent

在 SQL Always On HA 集群上調度作業

  • February 22, 2020

當使用 SQL Server Agent for AOHA 集群調度作業時,是否像伺服器是獨立的一樣使用 Master-Target 配置?或者是否有更好的方法將作業分發到所有伺服器,以便在主伺服器發生故障時可以由其中一個副本拾取它們?

我們在 AlwaysON AG 的所有實例中創建作業(並同步它們)。

您應該在作業中添加一個額外的邏輯來檢查實例是否是主要的,然後只執行作業。虛擬碼如下所示:

-- http://dba.stackexchange.com/a/45152/8783
if (select
       ars.role_desc
   from sys.dm_hadr_availability_replica_states ars
   inner join sys.availability_groups ag
   on ars.group_id = ag.group_id
   where ag.name = 'YourAvailabilityGroupName'
   and ars.is_local = 1) = 'PRIMARY'
begin
   -- this server is the primary replica, do something here
end
else
begin
   -- this server is not the primary replica, (optional) do something here
end

要同步登錄名、作業等,您可以使用PowerShellSQLSkills 中的此實用程序 (不確定它是否適用於 2014 年!)

Always On 可用性組 (AG) 實例上的 SQL 代理作業的難點在於,您通常希望作業僅在其所在節點是 PRIMARY 時執行。

您希望作業存在於每個節點上,以便在發生故障轉移時它們存在。

我發現讓代理工作“了解 AG”是最簡單的方法。我這裡講一個類似的情況。

一般的想法是向每個代理作業添加一段程式碼,以檢查它的節點目前是否是主節點。如果是則執行作業,如果不是則停止執行。

下面的程式碼(根據我的部落格文章修改)應該會有所幫助:

DECLARE @Role NVARCHAE(120);

SELECT @Role = ars.role_desc
FROM sys.availability_replicas ar
JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id
JOIN sys.availability_groups ag ON ars.group_id = ag.group_id
WHERE ag.name = 'YOUR AG'
AND ars.is_local = 1;

IF @Role = 'PRIMARY'
BEGIN;
 Your SQL Agent code
END;

引用自:https://dba.stackexchange.com/questions/129556