cảnh báo khi bất kỳ công việc trong một loại công việc không thành công


11

Có thể thiết lập một cảnh báo trong SQL Server 2008 sẽ gửi e-mail bất cứ khi nào một công việc trong một danh mục cụ thể không thành công?

Tôi tự hỏi vì tôi muốn thiết lập e-mail bất cứ khi nào đăng ký SSRS không thành công - và tất cả các đăng ký này đều là các công việc trong danh mục Máy chủ Báo cáo .

EDIT - hóa ra khi đăng ký SSRS không thành công, bản thân công việc không thất bại, vì vậy câu hỏi của tôi sẽ không áp dụng cho việc sử dụng giám sát đăng ký SSRS. Tuy nhiên tôi vẫn muốn biết về những công việc khác mà chúng tôi chạy trong môi trường của chúng tôi


Liệu một bước thất bại ít nhất? Câu trả lời của tôi dưới đây xem xét các công việc trong danh mục 'Máy chủ báo cáo' nhưng nếu bạn chỉ muốn tất cả các công việc, bạn có thể xóa toàn bộ AND EXISTSphần đó INSERT/SELECT. Và có lẽ thay đổi tên ReportServerJob_FailQueuethành một cái gì đó chung chung hơn. :-)
Aaron Bertrand

Thật không may, không có bước nào thất bại - nhưng tôi tự tin rằng tôi có thể đưa ra một số cơ chế giám sát khác!
JHFB

Câu trả lời:


10

Bạn có thể tạo một công việc kiểm tra bảng msdb.dbo.sysjobhistory mỗi phút (hoặc thường xuyên bạn muốn). Bạn có thể muốn thực hiện một bảng xếp hàng để bạn chỉ gửi tin nhắn cho bất kỳ lỗi đơn lẻ nào một lần.

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

Vì vậy, mã của bạn, mà bạn có thể lên lịch trong một công việc, trở thành:

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

Bây giờ tôi giả sử bạn muốn gửi một e-mail riêng cho mỗi lần thất bại, vì vậy đây cũng có thể là một phần của công việc (hoặc một phần của một công việc khác, mặc dù điều đó không nhất thiết phải khôn ngoan):

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;

Có một số tùy chọn khác nữa:

  • kéo vào sysjobhistory.message
  • nhìn vào các bước riêng lẻ thất bại
  • chỉ gửi tin nhắn cho bất kỳ công việc nào một lần trong n phút / giờ ngay cả khi có nhiều thất bại
  • gửi một e-mail với một danh sách tất cả các công việc đã thất bại, thay vì một e-mail cho mỗi thất bại
  • bạn có thể muốn bao gồm run_date và run_time trong tin nhắn, vì e-mail có thể không được gửi hoặc nhận đủ nhanh để trở thành thước đo chính xác khi công việc thực sự thất bại (Tôi không đưa nó vào đây vì các lựa chọn loại dữ liệu khủng khiếp của chúng định dạng công cụ Pita hoàng gia)
  • có thể bạn sẽ muốn dọn sạch các hàng cũ sau một thời gian, vì vậy cũng có thể cần một lệnh thanh trừng

Nếu Database Mail chưa được thiết lập, vui lòng xem hướng dẫn này .

Bạn cũng có thể sử dụng các công cụ của bên thứ 3 (ví dụ SQL Sentry Event Manager ) sẽ giúp việc này trở nên đơn giản hơn rất nhiều. Tiết lộ đầy đủ: Tôi làm việc cho SQL Sentry.


0

Dựa trên chỉnh sửa của bạn, đây sẽ chỉ là phần mở rộng câu trả lời của Aaron, liên quan đến lỗi đăng ký SSRS (không chỉ công việc của Tác nhân SQL). Tôi sẽ đề nghị chỉ cần thêm một bước vào công việc giám sát công việc, hoặc bạn có thể làm điều này như một công việc riêng biệt hoàn toàn.

Để có được trạng thái đăng ký, bạn chỉ cần kiểm tra ReportServer.dbo.ExecutionLog3 xem . Các Statuscột sẽ hiển thị bất cứ điều gì nhưng rsSuccesstrên thất bại. Chỉ cần lọc cho RequestType = 'Subscription'. Bạn sẽ muốn bao gồm một số kiểm tra thời gian, vì vậy bạn không kiểm tra tất cả các hồ sơ mỗi lần. Nếu bạn chạy công việc cứ sau 15 phút, chỉ cần kiểm tra TimeStarttrong 15 phút qua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.