작업 범주의 작업이 실패하면 경고


11

SQL Server 2008에서 특정 범주의 작업이 실패 할 때마다 전자 메일을 보내도록 경고를 설정할 수 있습니까?

SSRS 가입이 실패 할 때마다 전자 메일을 설정하고 싶기 때문에 궁금합니다. 이러한 모든 가입은 보고서 서버 범주의 작업입니다 .

편집 -SSRS 가입이 실패해도 작업 자체 실패 하지 않으므로 SSRS 가입 모니터링 사용에 내 질문이 적용되지 않습니다. 그러나 나는 우리가 환경에서 실행하는 다른 직업에 대해 여전히 알고 싶습니다.


단계가 적어도 실패합니까? 아래의 대답은 '보고서 서버'범주의 작업을 살펴 ​​보지만 모든 작업을 원하면의 전체 AND EXISTS부분을 제거 할 수 있습니다 INSERT/SELECT. 그리고 아마도 이름 ReportServerJob_FailQueue을 좀 더 일반적인 것으로 바꾸십시오 . :-)
Aaron Bertrand

불행히도 단계는 실패하지 않지만 다른 모니터링 메커니즘을 사용할 수 있다고 확신합니다!
JHFB

답변:


10

msdb.dbo.sysjobhistory 테이블을 1 분마다 (또는 자주 원하는 경우) 확인하는 작업을 만들 수 있습니다. 단일 인스턴스 실패에 대한 메시지를 한 번만 보내도록 큐 테이블을 구현할 수 있습니다.

USE msdb;
GO

CREATE TABLE dbo.ReportServerJob_FailQueue
(
  job_id UNIQUEIDENTIFIER,
  run_date INT,
  run_time INT, -- horrible schema, just matching sysjobhistory
  sql_message_id INT,
  sent BIT NOT NULL DEFAULT 0,
  PRIMARY KEY (job_id, run_date, run_time)
);

따라서 작업 일정을 잡을 수있는 코드는 다음과 같습니다.

INSERT dbo.ReportServerJob_FailQueue
  (job_id, run_date, run_time, sql_message_id)
SELECT job_id, run_date, run_time, sql_message_id
FROM msdb.dbo.sysjobhistory AS h
WHERE step_id = 0 
AND run_status = 0
AND EXISTS 
(
  SELECT 1 FROM msdb.dbo.sysjobs AS j
    INNER JOIN msdb.dbo.syscategories AS c
    ON j.category_id = c.category_id
    WHERE j.job_id = h.job_id
   AND c.name = 'Report Server'
)
AND NOT EXISTS 
(
  SELECT 1 FROM dbo.ReportServerJob_FailQueue
    WHERE job_id = h.job_id
    AND run_date = h.run_date
    AND run_time = h.run_time
);

이제 각 실패에 대해 개별 전자 메일을 보내려고한다고 가정하므로이 작업은 작업의 일부일 수도 있고 반드시 다른 작업의 일부일 수도 있습니다.

DECLARE 
  @subject NVARCHAR(4000),
  @body NVARCHAR(4000),
  @name SYSNAME,
  @id UNIQUEIDENTIFIER,
  @date INT,
  @time INT,
  @msg INT;

DECLARE c CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR SELECT q.job_id, q.run_date, q.run_time, q.sql_message_id, j.name
  FROM dbo.ReportServerJob_FailQueue AS q
  INNER JOIN msdb.dbo.sysjobs AS j
  ON q.job_id = j.job_id
  WHERE q.sent = 0;

OPEN c;

FETCH NEXT FROM c INTO @id, @date, @time, @msg, @name;

WHILE @@FETCH_STATUS = 0
BEGIN

  SET @subject = 'Report Server job ' + @name + ' failed.';
  SET @body = 'Error number: ' + RTRIM(@msg);

  BEGIN TRY
    EXEC msdb.dbo.sp_send_dbmail 
      @profile_name = 'default',     -- you may need to change this
      @recipients   = 'foo@bar.com', -- you will need to change this
      @subject      = @subject,
      @body         = @body;

    UPDATE dbo.ReportServerJob_FailQueue
      SET sent = 1 
      WHERE job_id = @id
      AND run_date = @date
      AND run_time = @time;
  END TRY
  BEGIN CATCH
    PRINT 'Will have to try that one again later.';
  END

  FETCH NEXT FROM c INTO @id, @date, @time, @msg, @name;
END

CLOSE c; DEALLOCATE c;

다른 옵션들도 있습니다 :

  • sysjobhistory.message를 가져옵니다.
  • 실패한 개별 단계를 살펴보십시오
  • 여러 번의 실패가 있더라도 n 분 / 시간에 한 번만 작업에 대한 메시지를 보냅니다.
  • 각 실패에 대한 이메일 대신 실패한 모든 작업 목록이 포함 된 단일 이메일을 보냅니다.
  • 작업이 실제로 실패한시기를 정확하게 측정 할 수있을만큼 전자 우편을 빨리 보내거나받지 못할 수 있으므로 메시지에 run_date 및 run_time을 포함 시키려고 할 수 있습니다 (끔찍한 데이터 유형 선택으로 인해 여기에 포함시키지 않았습니다) 왕실의 PITA를 형식화하십시오)
  • 시간이 지나면 오래된 행을 정리하고 싶을 수도 있으므로 제거 명령도 필요할 수 있습니다.

데이터베이스 메일이 아직 설정되지 않은 경우이 학습서 를 참조하십시오 .

써드 파티 툴 (예 : SQL Sentry Event Manager )을 사용하여 훨씬 간단하게 만들 수 있습니다. 전체 공개 : 저는 SQL Sentry에서 일합니다.


0

편집 내용에 따르면 이는 SSRS 구독 실패 자체 (SQL 에이전트 작업뿐만 아니라)에 관한 Aaron의 답변 확장 일뿐입니다. 작업 모니터링 작업에 단계를 추가하는 것이 좋습니다. 그렇지 않으면 별도의 작업으로 수행 할 수 있습니다.

구독 상태를 얻으려면 ReportServer.dbo.ExecutionLog3 보기를 확인하면 됩니다. 이 Status열에는 rsSuccess실패한 것 외에는 아무것도 표시되지 않습니다 . 를 필터링하십시오 RequestType = 'Subscription'. 시간 확인을 포함 시키려고 할 때마다 매번 모든 레코드를 확인하지는 않습니다. 15 분마다 작업을 실행하는 경우 TimeStart지난 15 분을 확인하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.