oracle scheduler - ghdrako/doc_snipets GitHub Wiki

Oracle Database Scheduler (DBMS_SCHEDULER)

A built-in Oracle database feature used to schedule and manage jobs like:

  • Running PL/SQL blocks
  • Executing shell scripts
  • Automating backups
  • Scheduling batch processes

Key components:

  • Jobs – units of work to run
  • Schedules – define when jobs run
  • Programs – define what the job does
  • Job Classes & Windows – for grouping and resource management
BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'my_job',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN my_procedure(); END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=2',
    enabled         => TRUE
  );
END;

Widoki systemowe dla schedulera

Informacje o zadaniach (jobs)

Widok Opis
DBA_SCHEDULER_JOBS Wszystkie zadania w bazie (dla DBA).
ALL_SCHEDULER_JOBS Zadania dostępne dla użytkownika (wraz z grantami).
USER_SCHEDULER_JOBS Zadania należące do aktualnego użytkownika.

Harmonogramy i definicje czasu

Widok Opis
DBA_SCHEDULER_SCHEDULES Zdefiniowane harmonogramy (repeat_interval).
USER_SCHEDULER_SCHEDULES Harmonogramy utworzone przez użytkownika.

Programy (programs)

Widok Opis
DBA_SCHEDULER_PROGRAMS Definicje programów (czyli co ma być wykonane).
USER_SCHEDULER_PROGRAMS Programy użytkownika.

Klasy zadań i okna (job classes & windows)

Widok Opis
DBA_SCHEDULER_JOB_CLASSES Klasy zadań do grupowania jobów.
DBA_SCHEDULER_WINDOWS Okna czasowe (np. backup w nocy).
DBA_SCHEDULER_WINDOW_GROUPS Grupowanie okien.

Informacje o uruchomieniach i historii

Widok Opis
DBA_SCHEDULER_JOB_RUN_DETAILS Historia uruchomień – czy się udały, błędy itd.
DBA_SCHEDULER_JOB_LOG Logi jobów (start, stop, status).
DBA_SCHEDULER_RUNNING_JOBS Aktualnie uruchomione joby.

Inne pomocne widoki

Widok Opis
DBA_SCHEDULER_CREDENTIALS Poświadczenia do uruchamiania zewnętrznych zadań (np. shell).
DBA_SCHEDULER_GLOBAL_ATTRIBUTE Atrybuty globalne schedulera.
DBA_SCHEDULER_JOB_ARGS Argumenty przekazywane do jobów.
DBA_SCHEDULER_CHAIN* Widoki związane z zaawansowanymi łańcuchami zadań.

Przykład: Sprawdzenie wszystkich aktywnych jobów

SELECT job_name, enabled, state, last_start_date, next_run_date
FROM dba_scheduler_jobs
WHERE enabled = 'TRUE';

wyłączyć i włączyć Oracle Scheduler

Wyłączenie Oracle Scheduler:

EXEC DBMS_SCHEDULER.disable(name => 'SYS.SCHEDULER$_EVENT_QUEUE');

Lub, żeby globalnie zatrzymać wszystkie joby (scheduler jako cały mechanizm):

ALTER SYSTEM SET "_disable_scheduler" = TRUE SCOPE=MEMORY;

Uwaga: to ukryty parametr, używaj go ostrożnie – najlepiej tylko w testowym środowisku.

Alternatywnie (zalecane i bez ukrytych parametrów):

BEGIN
  DBMS_SCHEDULER.stop_job(job_name => 'job_name', force => TRUE);
END;

Ale to działa tylko na konkretne joby.

Włączenie Oracle Scheduler:

Jeśli wcześniej użyłeś "_disable_scheduler" = TRUE, to cofnij to tak:

ALTER SYSTEM RESET "_disable_scheduler" SCOPE=MEMORY;

Lub:

ALTER SYSTEM SET "_disable_scheduler" = FALSE SCOPE=MEMORY;

I ewentualnie uruchom konkretne joby:

BEGIN
  DBMS_SCHEDULER.enable('nazwa_joba');
END;

Sprawdzenie statusu Scheduler'a:

SELECT VALUE FROM V$PARAMETER WHERE NAME = '_disable_scheduler';

Lub sprawdzenie, które joby są aktywne/nieaktywne:

SELECT job_name, enabled, state
FROM dba_scheduler_jobs
WHERE owner = 'SCHEMA_NAME';

Istotne kwestie

Status i zarządzanie błędami

  • Czy job zakończył się błędem?

    • Można to sprawdzać w DBA_SCHEDULER_JOB_RUN_DETAILS albo DBA_SCHEDULER_JOB_LOG.
  • Co się dzieje w przypadku błędu?

    • Czy job ma retry policy?
    • Sprawdź pola: max_failures, retry_count, restartable.

Zależności między jobami (łańcuchy – chains)

  • Czy używasz łańcuchów (chains) do tworzenia zależności między jobami? Oracle Scheduler pozwala na modelowanie skomplikowanych procesów ETL czy batchowych przy pomocy:
    • DBMS_SCHEDULER.CREATE_CHAIN
    • Widoki: *_SCHEDULER_CHAINS, *_SCHEDULER_CHAIN_RULES, *_CHAIN_STEPS

Bezpieczeństwo i poświadczenia (credentials)

  • Jeśli scheduler uruchamia zewnętrzne procesy (np. skrypt shellowy), czy używasz credentials? Sprawdź: DBA_SCHEDULER_CREDENTIALS
    • Czy są dobrze zabezpieczone hasła?

Wydajność i limity

  • Czy joby nie kolidują ze sobą? – np. wiele intensywnych zadań o tej samej porze
  • Czy używasz job_class i resource_manager do nadzorowania, ile zasobów może zająć dana klasa jobów?

Monitoring i alerting

  • Czy masz własny monitoring jobów?
  • Przykładowo:
    • Joby, które się nie uruchomiły od X dni
    • Joby, które kończą się błędem
    • Joby, które wykonują się dłużej niż zwykle

Repeat Interval – czy używasz Calendar Expressions czy PL/SQL Expressions?

  • Typowe repeat_interval:
    'FREQ=DAILY; BYHOUR=2; BYMINUTE=0;'
  • Ale można też używać dynamicznych wyrażeń PL/SQL.

Logowanie i przechowywanie historii

  • Jak długo trzymasz historię jobów? Domyślnie Oracle przechowuje je w SCHEDULER$_EVENT_LOG i SCHEDULER$_JOB_RUN_DETAILS.
  • Można użyć:
    DBMS_SCHEDULER.set_scheduler_attribute('max_job_log_entries', 1000);

Czyszczenie przeterminowanych jobów

  • Czy masz zadania jednorazowe (run_once)?
  • Czy czyszczone są stare, niepotrzebne wpisy z historii?

Checklist

Nr Obszar Punkt kontrolny
0 Zadania (Jobs) Czy wszystkie joby są w stanie ENABLED?
1 Zadania (Jobs) Czy są joby z błędami w ostatnich uruchomieniach?
2 Zadania (Jobs) Czy są joby, które nie uruchamiały się od X dni?
3 Harmonogramy Czy wszystkie harmonogramy mają poprawnie usta...
4 Logi i Historia Czy logi jobów są przechowywane wystarczająco ...
# Przygotowanie zestawu skryptów SQL do audytu Oracle Scheduler
sql_scripts = [
    {
        "Opis": "Joby w stanie innym niż ENABLED",
        "Skrypt": """SELECT owner, job_name, enabled FROM dba_scheduler_jobs WHERE enabled = 'FALSE';"""
    },
    {
        "Opis": "Joby z błędami w ostatnich uruchomieniach",
        "Skrypt": """
SELECT job_name, status, actual_start_date, run_duration, additional_info
FROM dba_scheduler_job_run_details
WHERE status != 'SUCCEEDED'
ORDER BY actual_start_date DESC;
"""
    },
    {
        "Opis": "Joby, które nie uruchamiały się od 7 dni",
        "Skrypt": """
SELECT job_name, last_start_date, next_run_date
FROM dba_scheduler_jobs
WHERE last_start_date < SYSDATE - 7;
"""
    },
    {
        "Opis": "Harmonogramy z repeat_interval",
        "Skrypt": """SELECT schedule_name, repeat_interval FROM dba_scheduler_schedules;"""
    },
    {
        "Opis": "Zbyt wiele logów – potrzeba czyszczenia?",
        "Skrypt": """
SELECT COUNT(*) AS liczba_logow
FROM dba_scheduler_job_log
WHERE log_date < SYSDATE - 30;
"""
    },
    {
        "Opis": "Joby bez retry_count i max_failures",
        "Skrypt": """
SELECT job_name, retry_count, max_failures
FROM dba_scheduler_jobs
WHERE retry_count = 0 AND max_failures = 0;
"""
    },
    {
        "Opis": "Joby uruchamiane o tej samej godzinie (możliwy konflikt)",
        "Skrypt": """
SELECT job_name, repeat_interval
FROM dba_scheduler_jobs
WHERE repeat_interval LIKE '%BYHOUR=2%'; -- Można zmienić BYHOUR
"""
    },
    {
        "Opis": "Joby zdefiniowane w klasach (job_classes)",
        "Skrypt": """
SELECT job_name, job_class FROM dba_scheduler_jobs;
"""
    },
    {
        "Opis": "Poświadczenia używane przez joby",
        "Skrypt": """
SELECT job_name, credential_name FROM dba_scheduler_jobs WHERE credential_name IS NOT NULL;
"""
    },
    {
        "Opis": "Jednorazowe joby (run_once)",
        "Skrypt": """
SELECT job_name, repeat_interval
FROM dba_scheduler_jobs
WHERE repeat_interval IS NULL;
"""
    },
    {
        "Opis": "Joby z dynamicznymi PL/SQL repeat_interval",
        "Skrypt": """
SELECT job_name, repeat_interval
FROM dba_scheduler_jobs
WHERE repeat_interval LIKE 'SYSTIMESTAMP%' OR repeat_interval LIKE 'TO_TIMESTAMP%';
"""
    }
]

df_sql_scripts = pd.DataFrame(sql_scripts)
tools.display_dataframe_to_user(name="Skrypty SQL do audytu Oracle Scheduler", dataframe=df_sql_scripts)