Casos do Dia a Dia: Resolvendo a falha de um job automaticamente com a opção RETRY JOB
Olá Pessoal,
Quem aí nunca teve uma falha de job onde a solução para essa falha foi simplesmente executar o job novamente?
Isso acontece muito em jobs de backup onde trafegamos os dados para outro local na rede.
Por um momento de instabilidade na rede na madrugada ou no fim de semana, todo o backup falha. Nesse caso, ou você fica atento a essas notificações de falhas e resolve na hora ou só vai resolver o problema quando chegar no trabalho.
Temos isso em alguns clientes. Já debatemos com eles o problema, mas muitos não conseguem solucionar a intermitência de rede.
Os jobs falhavam, recebíamos as notificações e tínhamos que logar no cliente para resolver. O que acaba gerando custo para o cliente do nosso valor hora que seria utilizado para coisas mais relevantes no ambiente.
Amenizando o problema…
O ideal é que seja investigado a causa raiz dessa intermitência na rede para resolver o problema em definitivo. Contudo, essa ação nem sempre tem um retorno rápido e podemos continuar sem Backup (isso é CRÍTICO) ou ter que agir manualmente toda vez que o JOB falhar.
Uma solução paliativa é utilizar a opção RETRY no JOB.
Para configurar essa opção, basta seguir os passos abaixo conforme o print:
Propriedades do JOB -> Steps -> Propriedades do Step 1 -> Advanced ->
Retry attempts: 3 (número de tentativas)
Retry interval (minutes): 1 (intervalo em minutos)
Para explicar o funcionamento do RETRY, criei um JOB que irá falhar por 3 vezes e funcionar na quarta execução.
Primeiro criei a tabela abaixo:
1 2 3 |
CREATE TABLE Teste_Retry(id INT) INSERT INTO Teste_Retry VALUES(1) |
Depois inclui o script abaixo no JOB que usa minha tabela de teste para controlar as 3 primeiras falhas e a quarta execução com sucesso:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
DECLARE @Tentativa INT SELECT @Tentativa = id FROM Teste_Retry --SELECT @Tentativa UPDATE Teste_Retry SET id = id + 1 IF (@Tentativa < 4) BEGIN PRINT 'TENTATIVA ' + CAST(@Tentativa AS VARCHAR) + ': VOU FALHAR E EXECUTAR NOVAMENTE PELO RETRY!' SELECT 1 / 0 END ELSE BEGIN PRINT 'TENTATIVA ' + CAST(@Tentativa AS VARCHAR) + ': EXECUTEI COM SUCESSO!!!' END |
Segue abaixo algumas observações após a execução do JOB:
- Repare que o Status do JOB fica como “Between retries” enquanto não terminar as tentativas ou executar com sucesso/erro.
- Conforme esperado, após 3 tentativas, o JOB finaliza com sucesso e fica com o Status “Succeeded” na tentativa 4.
- Repare como fica o History do JOB. Apesar de executar com sucesso na última tentativa, o histórico fica com uma exclamação por ter utilizado o RETRY.
Fabrício, mas como vou saber se meu backup está falhando e fazendo o RETRY?
Basta implantar minhas rotinas de Alerta ou o meu Checklist que será avisado quando isso acontecer.
Resumindo:
Como podemos observar, a opção RETRY é muito simples de ser configurada e pode ser muito útil.
No caso do JOB do Backup, utilizamos 3 tentativas e um intervalo de 1 hora entre as execuções. Dessa forma, o problema será resolvido automaticamente sem precisar de intervenção manual (custo $$$).
Isso já nos economizou horas de trabalho a noite e nos fins de semana.
Gostou dessa Dica?
Curta, comente, compartilhe com os coleguinhas…
Assine meu canal no Youtube e curta minha página no Facebook para receber Dicas de Leituras, Vídeos e Eventos sobre SQL Server.
Até a próxima.
Fabrício Lima
Microsoft Data Platform MVP
Consultor e Instrutor SQL Server
Trabalha com SQL Server desde 2006
Boa tarde Fabrício,
Tenho uma dúvida. Tenho um problema que é o seguinte. Tenho um job que está agendado para ser executado de 10 em 10 minutos. Ocorre que caso ocorra algumas falhas sucessivas gera um erro muito mais grave. No meu caso preciso configurar para que, caso o job falhe uma vez, quero retirar o schedule dele e, no momento oportuno, iremos tratar o problema de falhe do job. Sabe se consigo fazer isso? Obrigado
uma possivel solucao é rodar um comando quando falhar para desabilitar o job via script.