Mailbenachrichtigung bei Scheduler-Jobs

02.
Mai
2011
Veröffentlicht von: Hildegard Asenbauer

Mit Version 11g Release 2 wurde ein sehr nützliches Feature zur Überwachung von Datenbank-Jobs eingeführt: die automatische Mailbenachrichtigung. Die Einrichtung ist denkbar einfach: Zunächst muss ein Administrator den zu verwendenden Mailserver einmalig konfigurieren.

Mit Version 11g Release 2 wurde ein sehr nützliches Feature zur Überwachung von Datenbank-Jobs eingeführt: die automatische Mailbenachrichtigung. Die Einrichtung ist denkbar einfach: Zunächst muss ein Administrator den zu verwendenden Mailserver einmalig konfigurieren. In Version 11.2.0.1 ist nur ein SMTP-Server erlaubt, der keine Authentifizierung erfordert, mit Version 11.2.0.2 wurden auch Authentifizierung und SSL-Unterstützung ermöglicht, wobei letztere derzeit jedoch noch nicht funktioniert. Dann kann für jeden Job mit einem einzigen Aufruf ein Benachrichtigungsservice eingerichtet werden. Dabei ist konfigurierbar, in welchem Fall eine Mail versandt werden soll.

Konfiguration des Mailservers

Für die Konfiguration des Mailservers ist - wie für alle globalen Einstellungen des Schedulers - die Berechtigung MANAGE SCHEDULER nötig.

BEGIN
   DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE
      (ATTRIBUTE     => 'email_server',
       VALUE         => 'my_mailserver:25'
       );
END;
/

Als Mailserver kann der Name des Mailservers oder dessen IP-Adresse angegeben werden. Wird kein Port angegeben, so wird Port 25 verwendet. Wenn der SMTP-Server keine Authentifizierung verlangt, ist damit die Einrichtung schon abgeschlossen. Optional kann aber noch ein Default für den Absender ergänzt werden. Dieser Default wird herangezogen, wenn bei der Einrichtung der Benachrichtigung kein Absender angegeben wird.

BEGIN
    DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE (
       ATTRIBUTE      => 'email_sender',
       VALUE          => 'h.asenbauer@muniqsoft.de');
END;
/

Verlangt der Mailserver Authentifizierung, dann muss diese ebenfalls konfiguriert werden. Das geschieht in zwei Schritten:

  • Es muss ein Credential eingerichtet werden mit den Benutzerdaten, wie sie der Mailserver erwartet. Auf dieses Credential muss der User SYS EXECUTE-Rechte haben. Der Job-Eigentümer braucht kein EXECUTE-Recht.
  • Dieses Credential muss in der Scheduler-Konfiguration mitgegeben werden.

BEGIN
   DBMS_SCHEDULER.CREATE_CREDENTIAL
      (credential_name  => 'MAIL_CREDENTIAL',
       username         => 'my_user_account_mailserver',
       password         => 'my_passwort');
END;
/

-- Falls das Credential von einem anderen Benutzer als SYS angelegt wurde:
GRANT EXECUTE ON MAIL_CREDENTIAL to SYS;

BEGIN
   DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE (
      ATTRIBUTE      => 'email_server_credential',
      VALUE          => 'MAIL_CREDENTIAL');
END;
/

Die Scheduler-Einstellungen email_server und email_sender können ausgelesen werden über DBMS_SCHEDULER.GET_SCHEDULER_ATTRIBUTE; beim Versuch, email_server_credential auszulesen, erhält man jedoch:
ORA-27469: EMAIL_SERVER_CREDENTIAL ist kein gültiges scheduler Attribut

Probleme mit SSL-Versendung

Eine Versendung über SSL hat nicht funktioniert, deshalb ist die Konfiguration hier nicht beschrieben. Vermutlich lag der Grund im beschriebenen Bug 10354143 ("ORA-00600 [KWQITNMPHE:LTBAGI]").

Data Dictionary Views: DBA_SCHEDULER_CREDENTIALS

Einrichten der Benachrichtigung

Für die Einrichtung reicht ein Aufruf von DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION. Im einfachsten Fall geben Sie nur den Jobnamen und den Empfänger an, dann werden für den Rest Default-Werte herangezogen. Sie können aber auch explizit Absender, Betreff und Body angeben, und Sie können angeben, bei welchen Events eine Benachrichtigung erfolgen soll.

Ein einfaches Beispiel:

-- als SYS:
GRANT CREATE JOB TO SCOTT;

-- als SCOTT:
CREATE TABLE TEST
(ID   NUMBER CONSTRAINT test_pk PRIMARY KEY,
datum DATE);

CREATE PROCEDURE mail_test
IS
BEGIN
   INSERT INTO TEST
        VALUES (1, SYSDATE);
   COMMIT;
END;
/

BEGIN
   DBMS_SCHEDULER.CREATE_JOB(
      JOB_NAME        => 'MAIL_JOB',
      JOB_TYPE        => 'STORED_PROCEDURE',
      JOB_ACTION      => 'mail_test',
      REPEAT_INTERVAL => 'FREQ=MINUTELY',
      AUTO_DROP       => FALSE,
      ENABLED         => FALSE);
END;
/

BEGIN
   DBMS_SCHEDULER.ENABLE('MAIL_JOB');
END;
/

Dieser Job wird bei der ersten Ausführung erfolgreich sein, die zweite Ausführung führt wegen der PK-Verletzung zu einem Fehler.

 -- Einfachste Form der Benachrichtigung:
BEGIN
   DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION (
      job_name             => 'MAIL_JOB',
      recipients           => 'h.asenbauer@muniqsoft.de'
      );
END;
/

In diesem Fall wird der vorkonfigurierte Absender verwendet, und es gibt nur einen Empfänger. Eine Benachrichtigung erfolgt für die Ereignisse JOB_FAILED, JOB_BROKEN, JOB_SCH_LIM_REACHED, JOB_CHAIN_STALLED, JOB_OVER_MAX_DUR. Im Erfolgsfall erfolgt hier also keine Benachrichtigung. Sowohl Subject als auch Body entsprechen dem Default.

Im konkreten Fall würde das so aussehen:

Betreff:

Oracle Scheduler Job Notification - SCOTT.MAIL_JOB JOB_FAILED

Mailtext:

Job: SCOTT.MAIL_JOB
Event: JOB_FAILED
Date: 12-APR-11 02.12.31.503000 PM +02:00 Log id: 365 Job class: DEFAULT_JOB_CLASS Run count: 2 Failure count: 1 Retry count: 0 Error code: 1 Error message:
ORA-00001: Unique Constraint (SCOTT.TEST_PK) verletzt
ORA-06512: in "SCOTT.MAIL_TEST", Zeile 4

Betreff und Mailtext können über die Parameter subject und body (hier nicht gezeigt) genau vorgegeben werden, wobei mit Platzhaltern wie %job_name% oder %event_type% gearbeitet werden kann. Das ist aber eher Kosmetik, da der Informationsgehalt dadurch nicht steigt. Soll es mehr als einen Empfänger geben, so werden diese unter recipients als Komma-separierte Liste angegeben. Es kann auch eine Benachrichtigung eingerichtet werden für ALLE definierten Ereignisse. In diesem Fall erhält der Empfänger u.a. auch eine Mail beim Job-Start (JOB_STARTED) und bei erfolgreicher Beendigung (JOB_SUCCEEDED):

BEGIN
   DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION (
      job_name             => 'MAIL_JOB',
      sender               => 'info@muniqsoft.de',
      recipients           => 'h.asenbauer@muniqsoft.de',
      events               => 'DBMS_SCHEDULER.job_all_events');
END;
/

Wollen Sie beispielsweise nur im Fehlerfall und hier auch nur für den Fall der Unique Constraint-Verletzung eine Mail erhalten, so könnte der Aufruf so aussehen:

BEGIN
   DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION (
      job_name            => 'MAIL_JOB',
      sender              => 'info@muniqsoft.de',
      recipients          => 'h.asenbauer@muniqsoft.de',
      events              => 'DBMS_SCHEDULER.job_failed',
      filter_condition    => ':event.error_code=1'
      );
END;
/

Benachrichtigungen können wieder entfernt werden über

BEGIN
   DBMS_SCHEDULER.REMOVE_JOB_EMAIL_NOTIFICATION (
      job_name             => 'MAIL_JOB');
END;
/

Gibt man zusätzlich die Parameter recipients  oder events mit an, so können gezielt einzelne Empfänger oder einzelne Ereignisse aus der Benachrichtigung herausgenommen werden.Data Dictionary Views: DBA_SCHEDULER_NOTIFICATIONS

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.