mengingatkan ketika ada pekerjaan dalam kategori pekerjaan yang gagal

11

Apakah mungkin untuk mengatur peringatan di SQL Server 2008 yang akan mengirim email kapan saja pekerjaan dalam kategori tertentu gagal?

Saya bertanya-tanya karena saya ingin mengatur email kapan saja langganan SSR gagal - dan semua langganan ini adalah pekerjaan dalam kategori Server Laporan .

EDIT - ternyata ketika langganan SSRS gagal, pekerjaan itu sendiri tidak gagal, jadi pertanyaan saya tidak akan berlaku untuk penggunaan pemantauan langganan SSRS. Namun saya masih ingin tahu untuk pekerjaan lain yang kami jalankan di lingkungan kami

JHFB
sumber
Apakah setidaknya satu langkah gagal? Jawaban saya di bawah ini melihat pekerjaan dalam kategori 'Server Laporan' tetapi jika Anda hanya ingin semua pekerjaan Anda dapat menghapus seluruh AND EXISTSbagian dari INSERT/SELECT. Dan mungkin mengubah namanya ReportServerJob_FailQueuemenjadi sesuatu yang lebih umum. :-)
Aaron Bertrand
Sayangnya, tidak ada langkah yang gagal - tetapi saya yakin saya dapat menemukan beberapa mekanisme pemantauan lainnya!
JHFB

Jawaban:

10

Anda dapat membuat pekerjaan yang memeriksa tabel msdb.dbo.sysjobhistory setiap menit (atau sesering yang Anda inginkan). Anda mungkin ingin menerapkan tabel antrian sehingga Anda hanya pernah mengirim pesan untuk setiap kegagalan satu kali.

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

Jadi kode Anda, yang dapat Anda jadwalkan dalam suatu pekerjaan, menjadi:

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

Sekarang saya berasumsi Anda ingin mengirim email individu untuk setiap kegagalan, jadi ini bisa menjadi bagian dari pekerjaan juga (atau bagian dari pekerjaan yang berbeda, meskipun itu tidak selalu bijaksana):

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   = '[email protected]', -- 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;

Ada beberapa opsi lain juga:

  • tarik sysjobhistory.message
  • lihat langkah-langkah individual yang gagal
  • hanya mengirim pesan untuk pekerjaan apa pun sekali dalam n menit / jam bahkan jika ada beberapa kegagalan
  • mengirim satu email dengan daftar semua pekerjaan yang gagal, bukan email untuk setiap kegagalan
  • Anda mungkin ingin menyertakan run_date dan run_time dalam pesan, karena e-mail mungkin tidak terkirim atau diterima cukup cepat untuk menjadi ukuran akurat ketika pekerjaan itu benar-benar gagal (saya tidak memasukkannya di sini karena pilihan tipe data yang mengerikan mereka buat format itu menjadi royal PITA)
  • Anda mungkin ingin membersihkan baris lama setelah beberapa waktu, jadi perintah pembersihan juga mungkin diinginkan

Jika Database Mail belum diatur, silakan lihat tutorial ini .

Anda juga dapat menggunakan alat pihak ke-3 (mis. SQL Sentry Event Manager ) yang akan membuat ini lebih mudah. Pengungkapan penuh: Saya bekerja untuk SQL Sentry.

Aaron Bertrand
sumber
0

Berdasarkan hasil edit Anda, ini hanya akan menjadi perpanjangan dari jawaban Harun, mengenai kegagalan langganan SSR sendiri (bukan hanya pekerjaan SQL Agent). Saya sarankan hanya menambahkan dalam langkah ke pekerjaan pemantauan pekerjaan, atau Anda bisa melakukan ini sebagai pekerjaan yang terpisah sama sekali.

Untuk mendapatkan status berlangganan Anda hanya perlu memeriksa ReportServer.dbo.ExecutionLog3 tampilan . The Statuskolom akan menampilkan apa-apa tapi rsSuccesspada kegagalan. Cukup filter untuk RequestType = 'Subscription'. Anda akan ingin memasukkan beberapa cek waktu, jadi Anda tidak memeriksa semua catatan setiap waktu. Jika Anda menjalankan pekerjaan setiap 15 menit, cukup periksa TimeStart15 menit terakhir.


sumber