How to disable normal & scheduler jobs (DBMS_JOB & DBMS_SCHEDULER)

Tuesday, 21.04.2009 – Dejan

(Ako ima neka dobra duša da mi prevede naslov na srpski/hrvatski/crnski/gorski/balkancima-razumljiv-jezik, neka ostavi komentar)

Problem:

Periodično je potrebno napraviti kopiju produktivne baze za potrebe razvoja ili testiranja. Za tu svrhu možemo koristiti proces kloniranja baze (database cloning) ili restore-recover. Svejedno je koju metodu koristite.

Nakon što proces kopiranja bude gotov, po pokretanju kopirane baze automatski se pokreću definisani procesi (jobs)
Međutim, automatsko izvršavanje određenih procesa NIJE poželjno iz nekog razloga, kao npr.:
– proces kreira neki izvještaj i šalje ga putem emaila, pa primalac misli da je izvještaj iz produktivne baze
– proces vrši export podataka i pomoću UTL_FILE paketa kreira datoteku sa zastarjelim podacima na shared file serveru i to na destinaciji namijenjenoj samo za produktivne svrhe, usljed čega može doći do prepisivanja postojeće ispravne datoteke sa novijim podacima (file overwrited)

tj. iz bilo kojeg razloga, zbog kojeg bi došlo do mogućeg nesporazuma uzrokovanog pogrešnim podacima.

Cilj:

Dakle, trebalo bi nekako spriječiti automatsko izvršavanje definisanih procesa (poslova, tj. jobs) nakon pokretanja kopirane baze.

Rješenje:

Postoje dva načina kako da kreiramo neki posao (job) u bazi:
1. pomoću paketa DBMS_JOB
2. pomoću paketa DBMS_SCHEDULER (tek od verzije 10g)

Prvu vrstu poslova (DBMS_JOB) možemo deaktivirati tako što u init-datoteci vrijednost parametra job_queue_processes postavimo na nulu:

*.job_queue_processes=0

Tada će pozadinski procesi (J001, …, J00n), koji izvršavaju definisane poslove u bazi (jobs), biti deaktivirani i nijedan job neće biti pokrenut sve dok se parametar ne postavi na neku vrijednost veću od 0.

Drugu vrstu procesa (DBMS_SCHEDULER scheduled jobs) možemo deaktivirati uz pomoć AFTER STARTUP ON DATABASE okidača:

CREATE OR REPLACE TRIGGER tr_disable_scheduler 
AFTER STARTUP ON DATABASE 
DECLARE
  lvDBname   VARCHAR2(9);
  lvHostName VARCHAR(255);
BEGIN 
     
     SELECT LOWER(name) 
       INTO lvDBname 
       FROM v$database;

     SELECT LOWER(host_name) 
       INTO lvHostName 
       FROM v$instance;
      
     IF lvDBname <> 'proddb' AND
        lvHostName <> 'prodb.yourdomain.com'
     THEN 
       dbms_scheduler.set_scheduler_attribute('SCHEDULER_DISABLED', 'TRUE');
     END IF;
END;
/

Ovaj okidač (trigger) uspoređuje naziv aktuelne baze i servera na kojem se ta baza nalazi, sa unaprijed definisanim nazivima produktivne baze i servera. Ukoliko su vrijednosti različite, to znači da aktuelna baza nije produktivna i da scheduler treba deaktivirati, a to obavljamo pomoću procedure
DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE(‘SCHEDULED_DISABLED’,’TRUE’).

Informacije o poslovima (jobs) možete dobiti iz pogleda (views) DBA_JOBS, DBA_SCHEDULER_JOBS i DBA_SCHEDULER_RUNNING_JOBS, na osnovu kojih možete provjeriti kad je posao zadnji put izvršen, koliko puta i kad je idući termin izvršavanja.

  1. 3 Responses to “How to disable normal & scheduler jobs (DBMS_JOB & DBMS_SCHEDULER)”

  2. heh, pokušao sam prevesti na par načina i niti jedan prijevod mi se ne čini dobrim 🙂

    Možda:
    Kako deaktivirati normalne i planirane zadatke (DBMS_JOB & DBMS_SCHEDULER)

    By Marko on Apr 21, 2009

  3. Zaboravih reći, super ideja sa ovim triggerom…

    Moram to negdje zapisati – vrlo korisno! thx

    By Marko on Apr 21, 2009

  4. Korisno itekako! 🙂
    Ja sam muku mucio sa nekoliko scheduler jobova, koji su odmah po startu clone baze slali pogresne izvjestaje i prepisivali neke datoteke, ali sad nemam vise tih problema…

    By Dejan on Apr 22, 2009

Post a Comment