Oracle 10g Scheduler

mercoledì 30 aprile 2008 alle 30:54 | Pubblicato su Installation and Configuration, Oracle Certification | Lascia un commento

Negli ultimi tempi sono stato piuttosto impegnato (probabilmente lo sarò ancora per un po’) così ho scritto poco e mi dispiace. Oggi ho trovato un’attimo di tempo per cui pubblico velocemente una breve introduzione al nuovo (?) scheduler di Oracle 10g che fa parte del programma di esame per la certificazione OCP per cui cerco di proseguire la preparazione.

Oracle Scheduler

Con la versione 10g Oracle ha introdotto un nuovo scheduler che sostituisce il vecchio package DBMS_JOB (che comunque rimane a disposizione). Il nuovo scheduler ha una struttura piuttosto sofisticata e modulare il che facilita il riuso delle componenti e permette la definizione di schedulazioni molto complesse, con grande flessibilità. Per una trattazione veramente completa consiglio la consultazione del manuale “Administrators Guide” che ho trovato molto ben fatto.

Componenti dello Scheduler

come ho detto il nuovo scheduler, la cui API consiste nel package PL/SQL DBMS_SCHEDULER, ha una struttura modulare, il che significa che è composto da vari elementi che possono essere combinati insieme. Le componenti sono:

  • JOB
  • PROGRAM
  • SCHEDULE
  • WINDOW
  • JOB CLASSES
  • WINDOW GROUP
  • JOB CHAIN

JOB

Mantenendo una certa compatibilità d’uso con il vecchio package DBMS_JOB i job sono l’unico vero elemento fondamentale per poter “schedulare” un’operazione. Un job è un oggetto che specifica cosa eseguire e quando. Una novità importante dello scheduler è la nuova “CALENDARING SINTAX” per la specifica degli intervalli di schedulazione. La seconda novità importante è la possibilità di lanciare tramite lo scheduler anche procedure esterne (script di shell o altri eseguibili sul sistema operativo ospite). Per essere più precisi è possibile specificare tre tipi di “azioni” per un job:

  1. PLSQL_BLOCK, un blocco di codice pl/sql (possono essere anche più query SQL normali per esempio);
  2. STORED_PROCEDURE una procedura PL/SQL con possibilità di definire come oggetti anche i valori dei parametri da passare alla procedura.
  3. EXECUTABLE, un programma eseguibile sul sistema operativo, anche qui con la possibilità di definire come oggetti anche i valori dei parametri da passare al programma (solo di tipo stringa)

A livello più semplice ecco quindi un esempio di schedulazione di una procedura PL/SQL:

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name           =>  'update_sales',
   job_type           =>  'STORED_PROCEDURE',
   job_action         =>  'OPS.SALES_PKG.UPDATE_SALES_SUMMARY',
   start_date         =>  '28-APR-03 07.00.00 PM Australia/Sydney',
   repeat_interval    =>  'FREQ=DAILY;INTERVAL=2', /* every other day */
   end_date           =>  '20-NOV-04 07.00.00 PM Australia/Sydney',
   job_class          =>  'batch_update_jobs',
   comments           =>  'My new job');
END;
/

Occorre fare attenzione che i JOB per default sono sempre creati in stato “DISABLED”, quindi o si usa il parametro “enabled” o si abilitano successivamente con la procedure ENABLE del package DBMS_SCHEDULER.
Nell’esempio si vede anche la nuova “CALENDARING SINTAX” che specifica l’esecuzione del task a giorni alterni. Il nuovo package DBMS_SCHEDULER fornisce anche delle procedure per lanciare fuori dalla schedulazione gia pianificata il task (RUN_JOB), per fermare job in esecuzione (STOP_JOB).

PROGRAM

I program sono il primo elemento di modularità dello scheduler. Un program è un oggetto che permette di definire cosa deve essere eseguito (una procedura, un pezzo di codice PL/SQL, un eseguibile esterno) e gli eventuali parametri. Poi un program può essere usato nella definizione di uno o più job, al posto della coppia job_type,job_action dell’esempio di crezione di job gia vista. Ecco un esempio di definizione di un program:

BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
   program_name           => 'my_program1',
   program_action         => '/usr/local/bin/date',
   program_type           => 'EXECUTABLE',
   comments               => 'My comments here');
END;
/

Una volta definito un program, come detto può essere usato nella definizione di job, ad esempio:

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name           =>  'update_sales',
   program_name       =>  'my_program1',
   start_date         =>  '28-APR-03 07.00.00 PM Australia/Sydney',
   repeat_interval    =>  'FREQ=DAILY;INTERVAL=2', /* every other day */
   end_date           =>  '20-NOV-04 07.00.00 PM Australia/Sydney',
   job_class          =>  'batch_update_jobs',
   comments           =>  'My new job');
END;
/

SCHEDULE

Il secondo elemento di modularità dello scheduler sono gli SCHEDULE. Uno schedule è un oggetto che definisce degli intervalli. Uno schedule può poi essere usato nella definizione di uno o più job al posto del parametro repeat_interval. Ecco un esempio di definizione di uno schedule:

BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE (
  schedule_name     => 'my_stats_schedule',
  start_date        => SYSTIMESTAMP,
  end_date          => SYSTIMESTAMP + INTERVAL '30' day,
  repeat_interval   => 'FREQ=HOURLY; INTERVAL=4',
  comments          => 'Every 4 hours');
END;
/

Tale schedule poi può essere usato nella definizione di un job, ad esempio:

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name           =>  'update_sales',
   program_name       =>  'my_program1',
   schedule_name      =>  'my_stats_schedule',
   job_class          =>  'batch_update_jobs',
   comments           =>  'My new job');
END;
/

Quindi JOB, PROGRAM e SCHEDULE possono essere combinati insieme in vari modi per schedulare delle operazioni.

WINDOW

Le window sono oggetti che permettono di definire delle “finestre temporali” ovvero degli intervalli di tempo, a cui viene in particolare associato un RESOURCE PLAN. Un window può essere utilizzata anche come argomento per il parametro “schedule_name” in questo modo all’apertura della window

JOB CLASS

Le job class sono oggetti che permettono di definire caratteristiche comuni per più job, raggruppandoli appunto in “classi”. Le caratteristiche speficabili per una job class ed ereditate dai job appartenenti sono:

  • loggin_level, il livello di log
  • resource_consumer_group
  • service (in ambienti RAC)
  • log_history, per quanto mantenere i log

WINDOW GROUP

Le window possono essere ragruppate in gruppi. A differenza della relazione tra job e job classes, che è di tipo molti a uno, la relazione tra window e window group è di tipo molti a molti. Anche le window group possono essere usate come argomento per il parametro “schedule_name” della procedura CREATE_JOB.

JOB CHAIN

Si tratta di un oggetto piuttosto complesso, introdotto con la versione 10.2 di Oracle. La job chain permette da definizione di una catena di job la cui esecuzione è guidata da delle regole che si basano sull’esito dell’esecuzione del job precedente. Più che una catena, il flusso di esecuzione di una job chain è un albero (forse anche più genericamente un grafo, perchè forse nulla impedisce che più step partano all’avvio della chain, questo è da verificare). Per creare un job chain, si crea prima l’oggetto job chain con la procedura CREATE_JOB_CHAIN, poi si definiscono gli “step” (DEFINE_CHAIN_STEP) ovvero le procedure che possono essere eseguite all’interno della chain. Dopo di che occorre definire le regole che stabiliranno l’ordine di esecuzione dei passi (DEFINE_CHAIN_RULE)

Lascia un commento »

RSS feed for comments on this post. TrackBack URI

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: