我正在寻找处理sql Server 2012可用性组中的计划sql Server代理作业的最佳实践.也许我错过了一些东西,但是在目前的状态下我觉得sql Server Agent并没有真正集成这个伟大的sql2012功能.
如何使计划的sql代理作业知道节点切换?例如,我在主节点上运行的作业每小时加载一次数据.现在,如果主服务器发生故障,我如何激活现在成为主服务器的辅助服务器上的作业?
如果我总是在辅助服务器上安排作业,则会失败,因为辅助服务器是只读的.
解决方法
在sql Server代理作业中,有一些条件逻辑来测试当前实例是否正在为您在可用性组上查找的特定角色提供服务:
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
所有这一切都是拉动本地副本的当前角色,如果它处于PRIMARY角色,那么如果它是主副本,您可以执行您的工作需要做的任何事情. ELSE块是可选的,但如果本地副本不是主副本,则它可以处理可能的逻辑.
当然,将上述查询中的“YourAvailabilityGroupName”更改为您的实际可用性组名称.
不要将可用性组与故障转移群集实例混淆.实例是否是给定可用性组的主副本或辅助副本不会影响服务器级对象,如sql Server代理作业等.