AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 4734
Accepted
Nick Chammas
Nick Chammas
Asked: 2011-08-18 08:18:24 +0800 CST2011-08-18 08:18:24 +0800 CST 2011-08-18 08:18:24 +0800 CST

Como posso fazer com que o SQL Server me envie por e-mail os detalhes do erro quando um trabalho falha?

  • 772

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:

  1. você tem que adicionar uma nova etapa a cada trabalho que você tem, e
  2. você tem que rezar para que ninguém estrague o processo de alerta,spDBA_job_notification

Alguém conseguiu uma solução melhor?

sql-server monitoring
  • 4 4 respostas
  • 17599 Views

4 respostas

  • Voted
  1. Best Answer
    user507
    2011-08-18T09:11:10+08:002011-08-18T09:11:10+08:00

    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.

    • 10
  2. Marian
    2011-08-18T12:35:29+08:002011-08-18T12:35:29+08:00

    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).

    • 3
  3. user72649
    2015-08-13T08:32:08+08:002015-08-13T08:32:08+08:00

    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.

    SELECT  step_name, message
    FROM    msdb.dbo.sysjobhistory
    WHERE   instance_id > COALESCE((SELECT MAX(instance_id) FROM msdb.dbo.sysjobhistory
                                    WHERE job_id = $(ESCAPE_SQUOTE(JOBID)) AND step_id = 0), 0)
            AND job_id = $(ESCAPE_SQUOTE(JOBID))
            AND run_status <> 1 -- success
    
    IF      @@ROWCOUNT <> 0
    BEGIN
            RAISERROR('*** SQL Agent Job Prior Step Failure Occurred ***', 16, 1)
    
    DECLARE @job_name NVARCHAR(256) = (SELECT name FROM msdb.dbo.sysjobs WHERE job_id = $(ESCAPE_SQUOTE(JOBID)))
    DECLARE @email_profile NVARCHAR(256) = 'SQLServer Alerts'
    DECLARE @emailrecipients NVARCHAR(500) = '[email protected]'
    DECLARE @subject NVARCHAR(MAX) = 'SQL Server Agent Job Failure Report: ' + @@SERVERNAME
    DECLARE @msgbodynontable NVARCHAR(MAX) = 'SQL Server Agent Job Failure Report For: "' + @job_name + '"'
    
    --Dump report data to a temp table to be put into XML formatted HTML table to email out
    SELECT sjh.[server]
        ,sj.NAME
        ,sjh.step_id
        ,sjh.[message]
        ,sjh.run_date
        ,sjh.run_time
    INTO #TempJobFailRpt
    FROM msdb..sysjobhistory sjh
    INNER JOIN msdb..sysjobs sj ON (sj.job_id = sjh.job_id)
    WHERE run_date = convert(INT, convert(VARCHAR(8), getdate(), 112))
        AND run_status != 4 -- Do not show status of 4 meaning in progress steps
        AND run_status != 1 -- Do not show status of 1 meaning success
        AND NAME = @job_name
    ORDER BY run_date
    
    IF EXISTS (
            SELECT *
            FROM #TempJobFailRpt
            )
    BEGIN
    
    -----Build report to HTML formatted email using FOR XML PATH
    DECLARE @tableHTML NVARCHAR(MAX) = '
    <html>
    <body>
        <H1>' + @msgbodynontable + '</H1>
            <table border="1" style=
            "background-color: #C0C0C0; border-collapse: collapse">
            <caption style="font-weight: bold">
                ****** 
                Failure occurred in the SQL Agent job named: ''' + @job_name + ''' in at least one of the steps. 
                Below is the job failure history detail for ALL runs of this job today without needing to connect to SSMS to check.
                ******
            </caption>
    
    <tr>
        <th style="width:25%; text-decoration: underline">SQL Instance</th>
        <th style="text-decoration: underline">Job Name</th>
        <th style="text-decoration: underline">Step</th>
        <th style="text-decoration: underline">Message Text</th>
        <th style="text-decoration: underline">Job Run Date</th>
        <th style="text-decoration: underline">Job Run Time</th>
    </tr>' + CAST((
                SELECT td = [server]
                    ,''
                    ,td = NAME
                    ,''
                    ,td = step_id
                    ,''
                    ,td = [message]
                    ,''
                    ,td = run_date
                    ,''
                    ,td = run_time
                FROM #TempJobFailRpt a
                ORDER BY run_date
                FOR XML PATH('tr')
                    ,TYPE
                    ,ELEMENTS XSINIL
                ) AS NVARCHAR(MAX)) + '
        </table>
    </body>
    </html>';
    
    EXEC msdb.dbo.sp_send_dbmail @profile_name = @email_profile
        ,@recipients = @emailrecipients
        ,@subject = @subject
        ,@body = @tableHTML
        ,@body_format = 'HTML'
    
    --Drop Temp table
        DROP TABLE #TempJobFailRpt
    END
    ELSE
    BEGIN
        PRINT '*** No Records Generated ***' 
        DROP TABLE #TempJobFailRpt
    END
    END
    
    • 2
  4. Michael12345
    2020-08-31T10:39:14+08:002020-08-31T10:39:14+08:00

    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.

    • -1

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve