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.
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:
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
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
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
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.