SQL Server Administração

Como Parar um job em execução com outro job.

Como Parar um job em execução com outro job
Saiba como parar um job que está em execução com outro job.

Digamos que você precise parar um job em execução que roda durante a madrugada, você não está lá para parar ele manualmente certo? Digamos também que esse job se ele ultrapassar determinado horário ex: 7:00AM. Esse job começaria a bloquear várias tabelas que são necessárias para o andamento no ambiente de produção.

Então como você poderia parar ele caso ele ultrapassasse a janela de manutenção ou a janela de operações da madrugada? Para que na manhã seguinte você não encontre os clientes reclamando de lentidão no sistema e que não conseguem fazer nada.

Primeiro quero te mostrar algumas formas de visualizar os jobs que estão em execução.
A primeira e mais prática de todas é:
– Acessar o SQL Management Studio.
– Conectar na instância.
– Expandir SQL Server Agent.
– Clicar em Job Activity Monitor.

(imagem – job-activity-monitor)

Ou também via script:
– Primeira forma:

    SELECT  jb.name AS NomeDoJob,  
            jb.originating_server AS NomeDoServidor,  
            ja.run_requested_date AS InicioDoJob,  
            DATEDIFF(MINUTE, ja.run_requested_date, GETDATE()) as TempoDecorridoMinutos,  
            case when ja.last_executed_step_id is null  
                 then 'Step '+Cast (start_step_id as varchar(20)) +' ['+sstep.step_name+'] executing'  
                 else 'Step ' +Cast ( last_executed_step_id+1 as varchar(20))+' ['+ lstep.step_name  
                      + '] executing'   
            end CurrentStepID , sstep.step_name JobComecouNoStep  
            , Case ja.run_requested_source when 1 then 'SCHEDULER'  
                                   when 2 then 'ALERTER'  
                                   when 3 then 'BOOT'  
                                   when 4 then 'USER'  
                                   when 6 then 'ON_IDLE_SCHEDULE' else 'Unknown' end JobRunSource  
    FROM    msdb.dbo.sysjobs_view jb  
            INNER JOIN msdb.dbo.sysjobactivity ja ON jb.job_id = ja.job_id  
            INNER JOIN msdb.dbo.syssessions sess ON sess.session_id = ja.session_id  
            LEFT JOIN MSDB.DBO.sysjobsteps sstep ON sstep.step_id =start_step_id and sstep.job_id=jb.job_id  
            LEFT JOIN MSDB.DBO.sysjobsteps lstep ON lstep.step_id =last_executed_step_id + 1 and lstep.job_id=jb.job_id   
    WHERE   stop_execution_date IS NULL   
            AND run_requested_date IS NOT NULL

– Segunda forma:


SELECT
       [sjv].[name] AS Nome,
       [sjv].[description] AS Descricao,
       [sja].[run_requested_date] AS DataDeRequisicaoDaExecucao,
       [sja].[last_executed_step_id] AS UltimoStepExecutado
FROM [msdb].[dbo].[sysjobs_view] sjv
JOIN [msdb].[dbo].[sysjobactivity] sja
       ON [sjv].[job_id] = [sja].[job_id]
WHERE [sja].[run_requested_date] IS NOT NULL
AND [sja].[stop_execution_date] IS NULL

Beleza! Agora como podemos parar esse job que está em execução?
Simples usando a procedure sp_stop_job Ex: EXEC dbo.sp_stop_job N’SeuJob’
Só isso? Sim! Porém digamos que você criou um job e colocou o seguinte código para parar seu job:


use [msdb]
go
EXEC dbo.sp_stop_job N'SeuJob'
-- No parâmetro SeuJob é o nome do Job.

Se o job estiver rodando naquele momento, ele vai parar obviamente, agora se ele não estiver rodando ele vai retornar o seguinte erro:

Msg 14262, Level 16, State 1, Procedure sp_verify_job_identifiers, Line 67
The specified @job_name (‘SeuJob’) does not exist.

Então para contornar isso basta você fazer da seguinte forma:

USE msdb
IF EXISTS (SELECT
              1
       FROM msdb.dbo.sysjobs J
       JOIN msdb.dbo.sysjobactivity A
              ON A.job_id = J.job_id
       WHERE J.name = N'SeuJob'
       AND A.run_requested_date IS NOT NULL
       AND A.stop_execution_date IS NULL)
       --PRINT 'The job is running!'
       EXEC dbo.sp_stop_job N'SeuJob'
ELSE
       PRINT 'O Job Não Está Executando'

Sendo assim seu job não aparecerá como falha, mas sim uma mensagem informando que ele não está executando o que provavelmente ele já foi finalizado antes das 7:00AM

Lembrando que é válido também verificar esse job no seu checklist diário para descobrir se ele teve que parar o que estava em execução ou não. Se ele teve que parar, você deve imediatamente verificar o motivo que levou ele executar por tanto tempo.

Como Parar um job em execução com outro job.
The following two tabs change content below.

Wesley Mota

DBA SQL Server
Profissional graduado em Banco de Dados e Sistemas de Informação com mais de 7 anos de experiência em empresas de software. Certificado MCSA Microsoft SQL Server possui intensa vivência em administração de banco de dados, Tunning, Performance SQL Server, levantamento de melhorias e monitoramento de banco de dados e servidores SQL Server. Consultoria SQL Server em diversos clientes no Brasil e ao redor do mundo. Escritor no blog dbasqlserverbr.com.br/blog. Onde compartilha conhecimento, experiências e dicas de performance para DBAs SQL Server. Conhecimentos em Oracle e ambientes de alta disponibilidade. Desenvolvimento de softwares web e mobile.Gerenciamento de equipe e projetos.

Latest posts by Wesley Mota (see all)