Eu tenho uma situação que me deixou realmente coçando a cabeça. Esta é uma instância do SQL Server 2008r2, usada como servidor de banco de dados para um serviço corporativo substancial do SharePoint. Como minha empresa está fornecendo o suporte de banco de dados para ele, uma das coisas que fiz foi configurar alguns planos de manutenção para cuidar das coisas normais, incluindo backups completos noturnos de todos os bancos de dados às 19h.
Tudo isso funciona bem, exceto que ocasionalmente também funciona no início da manhã.
Até agora, isso aconteceu três vezes, uma vez há 11 dias às 2h47, uma vez há 4 dias às 3h43 e uma vez há 2 dias às 3h49. Não consigo encontrar nenhuma razão para que ele esteja sendo executado nesses horários aleatórios esporádicos.
Isso está causando problemas significativos para nós, pois de manhã cedo é quando o provedor de hospedagem do servidor executa seus trabalhos de backup e manutenção. Sua execução leva muito mais tempo do que o normal e estão enviando alertas e outros avisos para isso, longos tempos de IO e vários erros que parecem ser causados por conflitos com o espelhamento e backups SAN/NAS do host.
Resumindo o que já verifiquei:
Este é o trabalho do SQL Agent executando um tempo extra não programado e NÃO apenas o plano de manutenção sendo executado duas vezes no mesmo trabalho.
Isso não parece ser um clone de VM desse nó com um SQL Agent executando uma duplicata desse trabalho no SQL Server real. Concluo isso porque as execuções estão aparecendo no log do nosso SQL Agent. (se isso não for definitivo, deixe-me saber como verificar)
Este não é o caso de o trabalho ficar parado por um longo tempo. O trabalho regular é executado e concluído no horário agendado esperado todos os dias (19h).
Nem o servidor nem a instância do SQL Server foram reiniciados durante o último mês.
O trabalho do SQL Server em questão tem apenas um agendamento, definido para 19h todos os dias.
O Plano de Manutenção possui apenas um subplano, que apresenta exatamente o mesmo cronograma do Trabalho.
Qualquer ajuda muito apreciada.
Por sugestão de Aaron, adicionei o seguinte Execute SQL como a primeira tarefa no subplano:
IF (DATEPART(HOUR, GETDATE()) > 2) AND (DATEPART(HOUR, GETDATE()) < 6)
RAISERROR('Job Running at the Wrong Time!', 16, 1) WITH LOG
Bem, mistério resolvido.
Eu já havia postado isso em outro site (SqlServerCentral.com) e postado aqui depois de não ter obtido uma resposta por várias horas. Enquanto eu estava tentando a sugestão de Aaron aqui, um Josh postou o seguinte lá:
Embora eu já tivesse vasculhado a história de Jó, não procurei especificamente por essa mensagem. E eis que os não programados têm o seguinte:
Portanto, alguém deve ter marcado este trabalho para ser executado após um Alerta (provavelmente o trabalho errado).
Naturalmente, agora me sinto bobo por não verificar isso antes. Mas eu posto isso aqui agora, para que outros no futuro possam se beneficiar da minha supervisão.
Minhas sugestões:
Coloque uma verificação na etapa do trabalho para garantir que a lógica do plano de manutenção seja executada apenas quando o trabalho for iniciado entre 19h e 20h:
Isso não elimina o ruído proveniente de qualquer processo desonesto que esteja interferindo, mas evita os danos.
Adicione uma tabela de registro , por exemplo:
Procure o nome/job_id do trabalho e modifique
msdb.dbo.sp_start_job
adicionando-o bem no início (que também capturará falhas) ou logo antes dasp_post_msx_operation
lógica (que deve capturar apenas inicializações bem-sucedidas):Você também pode adicionar um gatilho à
JobAudit
tabela que envia um e-mail quando algo é inserido (para que você não precise monitorar a tabela manualmente).