Sql-Server-Agent
在 SQL Always On HA 集群上調度作業
當使用 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
要同步登錄名、作業等,您可以使用PowerShell或SQLSkills 中的此實用程序 (不確定它是否適用於 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;