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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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:
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 4 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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.