O SQL Server permite configurar um trabalho para enviar alertas de e-mail quando ele falhar. Esta é uma maneira simples e eficaz de monitorar seus trabalhos. No entanto, esses alertas não incluem nenhum detalhe, apenas um aviso de sucesso ou falha.
Se um trabalho falhar, este é o aspecto de um e-mail de alerta típico:
JOB RUN: 'DBA - Consistency Check Databases' was run on 8/14/2011 at 12:00:04 AM
DURATION: 0 hours, 0 minutes, 0 seconds
STATUS: Failed
MESSAGES: The job failed. The Job was invoked by Schedule 2 (Nightly Before
Backup 12AM). The last step to run was step 1 (Check Databases).
Para determinar a causa da falha, você precisa navegar até a instância no SQL Server Management Studio, localizar o trabalho e visualizar seu histórico de execução. Em um ambiente grande, pode ser uma dor ter que fazer isso constantemente.
O e-mail de alerta ideal incluiria o motivo da falha antecipadamente e permitiria que você começasse a trabalhar na solução.
Estou familiarizado com esta solução para este problema. Alguém tem alguma experiência com isso? Suas desvantagens são:
- você tem que adicionar uma nova etapa a cada trabalho que você tem, e
- você tem que rezar para que ninguém estrague o processo de alerta,
spDBA_job_notification
Alguém conseguiu uma solução melhor?
Algo que você pode fazer é apenas um pensamento, lançando ideias...
Crie um único trabalho que verifique periodicamente a tabela de trabalhos no msdb para ver se algum trabalho mostra falha, isso pode ser feito com uma boa consulta T-SQL . Em seguida, você pode acessar a tabela sysjobsteps e ver se um log de saída está definido para o trabalho. Faça com que um procedimento armazenado envie um e-mail anexando esse arquivo a ele. Você seria capaz de ver exatamente o que o trabalho fez desde o início até a falha sem precisar tocar no servidor.
Em seguida, também pode fazer com que o script do PowerShell verifique se há erros no log de eventos. Ele permite que você filtre bastante para obter exatamente os tipos de mensagem que está procurando. Você pode configurar isso como um trabalho do SQL Agent para ser executado periodicamente. Em seguida, no script do PowerShell, use o cmdlet de email para enviar a mensagem, se encontrar uma.
Idéias absurdas aqui, apenas algumas que eu pensei.
Eu tenho experiência com a idéia acima . É bom, mas uma ideia melhor seria fazer algo como Shawn disse.
O que fizemos foi criar um trabalho que é executado a cada 5 minutos e verifica as tabelas MSDB sobre falhas no trabalho. Para cada trabalho com falha, executaríamos o SP spDBA_job_notification com seu próprio ID, para que o SP verificasse as etapas do histórico do MSDB em busca de erros e as enviasse por e-mail. Na documentação do SP: "O procedimento armazenado usa a ID do trabalho para consultar as tabelas do agente msdb para obter a mensagem de erro mais recente desse trabalho."
Portanto, em vez de apenas mudar todos os trabalhos, é melhor criar um único que faça tudo ;-).
Outra ideia é definir todos os trabalhos para gravar no Windows Event Viewer em caso de erros/falhas e ler a partir daí com proc estendido xp_ReadErrorLog ou uma ferramenta automática, se você já tiver isso em sua rede. Por exemplo, usamos HPOV para verificar quaisquer problemas do sistema e podemos configurar um alerta simples para todos os erros do visualizador de eventos (sem necessidade de nenhum trabalho ou procedimento personalizado).
Experimente e apenas conecte suas variáveis conforme necessário no TSQL. A chave aqui é colocar isso como a última etapa de cada trabalho individual do agente SQL, mas cada etapa do trabalho acima precisa ir para a PRÓXIMA ETAPA, seja FALHA ou SUCESSO ... Funciona para mim muito bem na maior parte, mas por favor relate quaisquer problemas que encontrar. Estamos no SQL Server 2008 R2, então é aqui que ele é usado onde o configurei atualmente.
Ainda outra resposta para essa pergunta realmente antiga, esse procedimento armazenado parece funcionar muito bem.
https://karaszi.com/mailafterjob-send-email-after-agent-job-include-ouput-files
Tibor incluiu um ótimo resumo do procedimento armazenado, descrição dos parâmetros e exemplo.