DBAtlas · Atlas für Datenbankbetrieb

Scheduler-Job anlegen, manuell ausführen, deaktivieren und löschen

OracleScheduler

Befehl

-- 1) Create disabled, set attributes, then enable:
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'CUSTOMER_APP.NIGHTLY_STATS',
    job_type        => 'PLSQL_BLOCK',
    job_action      => q'[BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'CUSTOMER_APP', options => 'GATHER STALE'); END;]',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
    enabled         => FALSE,
    auto_drop       => FALSE,
    comments        => 'Nightly stale statistics gathering');
  DBMS_SCHEDULER.SET_ATTRIBUTE('CUSTOMER_APP.NIGHTLY_STATS', 'max_run_duration', INTERVAL '2' HOUR);
  DBMS_SCHEDULER.SET_ATTRIBUTE('CUSTOMER_APP.NIGHTLY_STATS', 'logging_level', DBMS_SCHEDULER.LOGGING_FULL);
  DBMS_SCHEDULER.ENABLE('CUSTOMER_APP.NIGHTLY_STATS');
END;
/

-- 2) Validate the calendar expression (next run time):
SET SERVEROUTPUT ON
DECLARE
  l_next TIMESTAMP WITH TIME ZONE;
BEGIN
  DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING(
    calendar_string   => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
    start_date        => SYSTIMESTAMP,
    return_date_after => SYSTIMESTAMP,
    next_run_date     => l_next);
  DBMS_OUTPUT.PUT_LINE('Next run: ' || l_next);
END;
/

-- 3) Run now in the background (does not affect the schedule):
EXEC DBMS_SCHEDULER.RUN_JOB('CUSTOMER_APP.NIGHTLY_STATS', use_current_session => FALSE);

-- 4) Status:
SELECT owner, job_name, enabled, state, run_count, failure_count,
       last_start_date, next_run_date
FROM   dba_scheduler_jobs WHERE owner = 'CUSTOMER_APP';

-- 5) Stop (if running) / disable / drop:
-- EXEC DBMS_SCHEDULER.STOP_JOB('CUSTOMER_APP.NIGHTLY_STATS', force => FALSE);
EXEC DBMS_SCHEDULER.DISABLE('CUSTOMER_APP.NIGHTLY_STATS', force => TRUE);
EXEC DBMS_SCHEDULER.DROP_JOB('CUSTOMER_APP.NIGHTLY_STATS', force => TRUE);

Was es tut

Definiert mit DBMS_SCHEDULER einen geplanten PL/SQL-Job; setzt max_run_duration (löst bei Überschreitung ein Event aus) und eine detaillierte Logging-Stufe, validiert den Kalenderausdruck vorab und erlaubt einen manuellen Lauf, ohne den Zeitplan zu stören.

Wann einsetzen

Um wiederkehrende Datenbankarbeiten wie Wartung, ETL und Bereinigung statt per cron innerhalb der Datenbank auszuführen, mit Berücksichtigung von RAC/Data Guard.

Vorsicht

Keine Zusatzlizenz. Die Zeitzone von start_date ist wichtig: SYSTIMESTAMP nutzt die TZ des Datenbankservers; verwende eine explizite Region (z. B. 'Europe/Istanbul'), um Verschiebungen bei der Zeitumstellung zu vermeiden. Bei JOB_QUEUE_PROCESSES=0 läuft kein Job. DISABLE mit force=>TRUE stoppt eine laufende Ausführung nicht, sondern verhindert nur künftige Läufe; zum Abbrechen STOP_JOB verwenden. Einen Job in einem anderen Schema anzulegen erfordert CREATE ANY JOB.

In DBAtlas öffnen →

Verwandte Einträge