2016-12-09 2 views
1

Я хочу, чтобы иметь возможность автоматически включать/отключать задание агента SQL, определяя, какой сервер является активным, а какой - пассивный. Другими словами, если основной сервер, на котором задание включено, переходит на вторичный сервер, то задание будет отключено, и задание на вторичном сервере (теперь основное) будет включено.Автоматическое включение/выключение задания агента SQL

Я нашел скрипт, который делает именно то, что мне нужно, и слегка модифицирован моим стандартам: http://sqlmag.com/blog/alwayson-availability-groups-and-sql-server-jobs-part-28-additional-options-tackling-jobs-failo

ALTER procedure [dbo].[SQLAgentJobFailover] (@agname varchar(200)) 
AS 
BEGIN 
    declare @is_primary_replicate bit 
    declare @job_name VARCHAR(100) = 'MySQLAgentJobName' 
    declare @job_enabled bit 

    select @is_primary_replicate = master.dbo.fn_hadr_group_is_primary(@agname) 

    declare job_cursor cursor for 
    select s.name from msdb.dbo.sysjobs s 
    inner join msdb.dbo.syscategories c on s.category_id = c.category_id 
    where c.name = @agname 
    order by name 

    open job_cursor 
    fetch next from job_cursor into @job_name 
    while @@fetch_status = 0 
    begin 
      select @job_enabled=enabled from msdb.dbo.sysjobs where name = @job_name 
      if @is_primary_replicate = 1 
      begin 
       if @job_enabled = 1 
         print @job_name+' enabled on primary. do nothing' 
       else 
       begin 
         print @job_name+' disabled on primary. enable it !' 
         exec msdb.dbo.sp_update_job @job_name = @job_name,@enabled = 1 
       end 
      end 
      else if (@is_primary_replicate = 0) 
      begin 
       if @job_enabled = 1 
       begin 
         print @job_name+' enabled on secondary. disable it !' 
         exec msdb.dbo.sp_update_job @job_name = @job_name,@enabled = 0 
       end 
       else 
         print @job_name+' disabled on secondary. do nothing' 
      end 
      fetch next from job_cursor into @job_name 
    end 
    close job_cursor 
    deallocate job_cursor 
END 

GO 

Также здесь функция сценария:

ALTER FUNCTION dbo.fn_hadr_group_is_primary (@AGName sysname) 
RETURNS bit 
AS 
    BEGIN 

      DECLARE @PrimaryReplica sysname; 

      SELECT @PrimaryReplica = hags.primary_replica 
      FROM 
        sys.dm_hadr_availability_group_states hags 
        INNER JOIN sys.availability_groups ag ON ag.group_id = hags.group_id 
      WHERE 
        ag.name = @AGName; 

      IF UPPER(@PrimaryReplica) = UPPER(@@SERVERNAME) 
        RETURN 1; -- primary 

      RETURN 0; -- not primary 

    END; 
GO 

Однако, когда я исполняю на вторичный сервер, такой как:

exec master.dbo.SQLAgentJobFailover @agname = 'CorpAnalyticsAG' 

В нем говорится, что команда успешно завершена, однако задание не отключено.

Я понятия не имею, почему.

Ниже мое имя AG

enter image description here

Любые идеи?

+2

так ли это напечатать что-нибудь? Кроме того, установка переменной @job_name на что-то бесполезно, поскольку вы немедленно меняете ее в курсоре. который, если вы пытаетесь сделать это только для одного задания, вам вообще не нужен курсор. Также вы создали функцию dbo.fn_hadr_group_is_primary в мастер или где-то еще? Вставьте код для этой функции, чтобы мы могли видеть, хорошо ли это. Кроме того, возможно, вы просто не передаете право (at) agname (имя группы доступности), поэтому никакие строки не возвращаются в выборе курсора и никаких действий не предпринимается ..... – Matt

+0

Да, вы на 110% правы, я не нужен курсор. Казалось, что как только я прокомментировал разделы курсора, хранимая процедура успешно выполнена и включила задание. Если вы поместите свой комментарий в качестве ответа, я бы с радостью принял его. – AznDevil92

+0

@Matt подумал, что пометил вас для вышеуказанного комментария – AznDevil92

ответ

1

Одна из проблем заключается в том, что значение, которое вы устанавливаете для переменной @job_name, является над написанным в определении курсора. Поскольку это фактически не включает или не отключает задание, определение курсора вряд ли возвращает задание, которое вы действительно хотите включить или отключить в пределах его набора результатов, которое может быть вызвано, скорее всего, значением @agname, которое передается, и/или выбором выбора курсора ,

Потому что вы только хотите иметь дело с одной работы, вы действительно не нужно определение курсора, но вам все еще нужно проверить, если первичная реплика такая же, как @@SERVERNAME

Смежные вопросы