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.
3 Responses to “How to disable normal & scheduler jobs (DBMS_JOB & DBMS_SCHEDULER)”
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
Zaboravih reći, super ideja sa ovim triggerom…
Moram to negdje zapisati – vrlo korisno! thx
By Marko on Apr 21, 2009
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