попереджуйте, коли будь-яка робота в категорії робіт не працює


11

Чи можливо налаштувати попередження в SQL Server 2008, яке надсилатиме електронне повідомлення в будь-який час, коли завдання в певній категорії не вдасться?

Мені цікаво, тому що я хотів би налаштувати електронну пошту будь-коли, коли підписка на SSRS не вдасться - і всі ці підписки є завданнями в категорії сервера звітів .

EDIT - виявляється, що коли підписка на SSRS не працює, сама робота не виходить з ладу, тому моє запитання не стосуватиметься моніторингу використання підписки на SSRS. Однак я все одно хотів би знати про інші роботи, які ми виконуємо в нашому середовищі


Хоча крок провалюється хоча б? Моя відповідь нижче розглядає завдання в категорії "Сервер звітів", але якщо ви просто хочете виконати всі завдання, ви можете видалити всю цю AND EXISTSчастину INSERT/SELECT. І, ймовірно, змінити ім’я ReportServerJob_FailQueueна щось більш загальне. :-)
Аарон Бертран

На жаль, жоден крок не вдається - але я впевнений, що я можу придумати якийсь інший механізм моніторингу!
JHFB

Відповіді:


10

Ви можете створити завдання, яке перевіряє таблицю історії msdb.dbo.sysjobhistory щохвилини (або, як часто ви хочете). Можливо, ви хочете реалізувати таблицю черг, щоб ви коли-небудь надсилали повідомлення про будь-який збій одного примірника один раз.

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 Agent). Я б запропонував лише додати крок до роботи з моніторингу роботи, або ви можете взагалі зробити це як окреме завдання.

Щоб отримати статус підписки, ви просто перевірте ReportServer.dbo.ExecutionLog3 подання . У Statusколонці буде показано що завгодно, крім rsSuccessвипадків відмов. Просто фільтруйте для RequestType = 'Subscription'. Ви хочете включити деяку перевірку часу, тому ви не перевіряти всі записи кожен раз. Якщо ви виконуєте роботу кожні 15 хвилин, просто перевіряйте наявність TimeStartостанніх 15 хвилин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.