Sommer-/Winterzeit und Oracle DBMS_SCHEDULER

Ende März hatte ich ein Projekt gehabt, bei dem auch ein Schedulerjob angelegt werden musste. Der Job sollte von Montag bis Freitag um 8 Uhr morgens starten und zum letzten mal um 18 Uhr gestartet werden. Dabei sollte der Job automatisch gestartet werden, falls die DB mal runtergefahren werden sollte
So legte ich den Job an:

BEGIN
dbms_scheduler.create_job ( job_name => 'MY_JOB'
, job_type => 'STORED_PROCEDURE'
, job_action => 'SCOTT.MY_JOB'
, start_date => SYSDATE
, repeat_interval => 'freq=SECONDLY; byday=MON,TUE,WED,THU,FRI; BYHOUR=8,9,10,11,12,13,14,15,16,17,18'
, end_date => NULL
, enabled => TRUE
, comments => 'Job to test the effect of time zone.'
);
END;
/

Soweit war alles gut, der Job startete zu der gewünschten Zeit, bis die Zeitumstellung am 31. März kam. Als ich dann den Job am 1. April überprüfte stellte ich fest, dass der Job nicht wie gewünscht um 8 Uhr gestartet hat.
Die Abfrage auf der user_scheduler_jobs View ergab folgende Information

SQL> SELECT
           job_name
          ,start_date
          ,next_run_date
    FROM user_scheduler_jobs
    WHERE job_name ='MY_JOB';
 
JOB_NAME           START_DATE                  NEXT_RUN_DATE
------------------ ----------------------------------- ------------------------------------
MY_JOB 20-MAR-12 23.30.10.154755 AM +02:00  1-APR-12 08.00.00.685030 AM +02:00

Der Job sollte um 8 Uhr morgens gestartet werden jedoch in der Zeitzone +02:00. Nach der Zeitumstellung wurde die Zeitzone nicht aktualisiert und somit wurde starte der Job eine Stunde später.
Eine kleine recherche im Internet ergab, dass die Jobs solcher Art mit einer explizieten angabe der Timezone angelegt werden sollten

BEGIN
  dbms_scheduler.drop_job('MY_JOB');
END;
/
 
PL/SQL PROCEDURE successfully completed.
 
SQL> BEGIN
        dbms_scheduler.create_job ( job_name => 'MY_JOB'
        , job_type => 'STORED_PROCEDURE'
        , job_action => 'SCOTT.MY_JOB'
        , start_date => systimestamp at TIME zone 'EUROPE/BERLIN', -- Unterschied liegt hier
        , repeat_interval => 'freq=SECONDLY; byday=MON,TUE,WED,THU,FRI; BYHOUR=8,9,10,11,12,13,14,15,16,17,18'
        , end_date => NULL
        , enabled => TRUE
        , comments => 'Job to test the effect of time zone.'
        );
    END;
    /

So wir der Scheduler Job auch mit der Zeitumstellung zurecht kommen. Und würde auch nach der weiteren Umstellung auf Winterzeit um 8 Uhr starten.

weitere Informationen zu Scheduler Jobs in Oracle:
* Job-Steuerung in Oracle Datenbanken
* Scheduler (DBMS_SCHEDULER) Enhancements in Oracle Database 11g Release 2
* Oracle 11.1 Doku- Scheduler Jobs

Leave a Reply