Chains und der Scheduler

06.
März
2019
Veröffentlicht von: Daniel Jaouadi

Der folgende Monatstipp dreht sich um den Oracle Scheduler mit dessen Hilfe Programs für eine automatische Abfolge konfiguriert werden können. Mithilfe von diversen Rules, die bestimmen was als Nächstes passiert, lassen sich so vielfältige Lösungen für diverse Ausgänge der gestarteten Programs entwickeln. Werfen wir doch einen genaueren Blick darauf:

Das Erstellen von sogenannten „Chains“ kann ein wenig verwirrend sein, aber bietet im Austausch dafür, einige praktische Lösungen.

Die Chains des Schedulers werden benutzt, um verschiedene Programs in einer nach Rules definierten Abfolge laufen zu lassen.

In den folgenden Schritten konstruieren wir eine Chain, welche drei Programs (selbst geschriebene Prozeduren), abhängig vom Erfolg bzw. Misserfolg des vorherigen Program, startet.

Im Allgemeinen ist es immer derselbe Ablauf für das Erstellen von Chains:

  1. Erstellen der Chain
  2. Definieren der Chain Steps
  3. Definieren von Rules
  4. Aktivieren der Chain
  5. Einen Job erstellen, welcher die Chain ausführt.

Bevor wir anfangen, definieren wir unsere Prozedur als ein Program und aktivieren es. Dadurch können wir das zuvor erstelle Program in die Steps der Chain einbinden.

Erstellen der Programs zum Ausführen

BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
   program_name           => 'program1',
   program_action         => 'package1.prozedur1',
   program_type           => 'STORED_PROCEDURE',
   comments               => 'Mein Programm für meine Prozedur');
END;
/

Aktivierung des Program

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

Gemacht wird das mit allen Prozeduren, die wir für die Chain benötigen. Ich habe das ganze noch mit Program 2 und Program 3 durchgeführt.

Jetzt wo die Programs erstellt wurden, können wir mit der Konstruktion unserer Chain anfangen.

1. Erstellen der Chain

BEGIN
DBMS_SCHEDULER.CREATE_CHAIN (
   chain_name          => 'chain1',
   rule_set_name       => NULL,
   evaluation_interval => NULL,
   comments            => 'Das ist meine Chain');
END;
/

Hiermit wird eine Chain mit dem Namen „Chain1“ erstellt.

2. Steps der Chain definieren

BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
   chain_name      =>  'chain1',
   step_name       =>  'step1',
   program_name    =>  'program1');
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
   chain_name      =>  'chain1',
   step_name       =>  'step2',
   program_name    =>  'program2');
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
   chain_name      =>  'chain1',
   step_name       =>  'step3',
   program_name    =>  'program3');
END;
/

Jedes Program hat jetzt seinen eigenen Step. Nun können wir diese in den Rules der Chain festlegen.

3. Rules der Chain definieren

Hier legen wir die Rules fest:

  • Program1 (bzw. Step1) startet
  • Sollte Program1 erfolgreich sein, startet Program2 (bzw. Step2)
  • Sollte Program1 fehlschlagen, startet Program3 (bzw. Step3)
  • Sobald Program2 oder Program3 abgeschlossen sind, endet die Chain.

Bildlich kann man sich das so vorstellen:

BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   chain_name   =>   'chain1',
   condition    =>   'TRUE',
   action       =>   'START step1',
   rule_name    =>   'rule1',
   comments     =>   'start the chain');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   chain_name   =>   'chain1',
   condition    =>   'step1 SUCCEEDED',
   action       =>   'START step2',
   rule_name    =>   'rule2');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   chain_name   =>   'chain1',
   condition    =>   'step1 FAILED',
   action       =>   'START step3',
   rule_name    =>   'rule3');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
  chain_name   =>    'chain1',
  condition    =>    'step3 COMPLETED',
  action       =>  'END',
  rule_name    =>  'rule4');
  DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
  chain_name   =>  'chain1',
  condition    =>    'step2 COMPLETED',
  action       =>  'END',
  rule_name    =>    'rule5');
END;
/

Ein wichtiger Unterschied macht hier „SUCCEDED“ und „COMPLETE“. SUCCEDED ist dann erreicht sobald der Step eben auch erfolgreich durchgeführt wurde. „Completed“ ist ein Job immer dann, wenn er einfach durchgelaufen ist. Auch ein FAILED Step ist ein COMPLETED Step.

4. Aktivieren der Chain

Als nächstes muss die Chain aktiviert werden:

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

5. Job für Chain Start erstellen

Den Job für den Chain Start erstellen wir mit folgenden Parametern:

  • Erster Start ist am 1. März um 3 Uhr nachts. Sofern vor repeat_interval danach liegt (start_date)
  • Das Intervall ist jede Woche montags um 3 Uhr nachts (repeat_interval)
  • Das automatische Löschen des Jobs nach der Ausführung ist deaktiviert (auto_drop)
  • Und der Job ist direkt aktiv (enabled)

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
  job_name        => 'chain_starter1',
  job_type        => 'CHAIN',
  job_action      => 'chain1',
  repeat_interval => 'FREQ=WEEKLY; BYDAY=MON; BYHOUR=03',
  auto_drop       =>  FALSE,
  start_date      => '01-MAR-19 03.00.00 AM Europe/Berlin',
  comments        => 'Starter für Chain1',
  enabled         => TRUE);
END;
/

Nun haben wir eine funktionierende Chain für den Scheduler. 

Fazit

Das Erstellen einer Chain ist relativ simpel und hat durchaus eine Daseinsberechtigung. Es ist eine vielfältige Konstruktion die sich nach Belieben anpassen lässt. 

Die Bedingungen „SUCCEEDED“ und „FAILED“ in den Regeln sind nur Beispiele dessen, was alles gemacht werden kann.  Es gibt noch einige mehr welche auch zu deutlich komplexeren Chains entwickelt werden können. Dieser Tipp soll nur ein erstes Bild vermitteln.

Für weitere Fragen bezüglich des Schedulers stehen wir Ihnen natürlich gerne zur Öffnet internen Link im aktuellen FensterVerfügung.

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.