In dit artikel wat je allemaal met een job kunt doen als je deze eenmaal hebt aangemaakt, waaronder:
De DBMS_JOB Package Een Job aan de Job Queue toevoegen Een Job aanpassen Broken Jobs Een Job dwingen om uitgevoerd te worden Hoe een Job op Broken komt te staan Hoe Jobs Uit te voeren Job Definities Managen van Job Queues Een Job van de Job Queue verwijderen Het Runnen van Broken Jobs De DBMS_JOB Package beslaat een aantal procedures. De meeste van deze procedures hebben een commit nodig voordat de veranderingen door het achtergrond proces worden meegenomen. Procedure SUBMITOm een job aan de job queue toe te voegen.
DBMS_JOB.SUBMIT( job OUT BINARY_INTEGER, what IN VARCHAR2, next_date IN DATE, interval IN VARCHAR2, no_parse IN BOOLEAN) Uitleg van de onderdelen in Een Job aan de Job Queue toevoegen Een Job aanpassenOm een job aan te passen die al toegevoegd is aan de job queue (zie scheduled_DBMS_JOBS), kan je de volgende procedures gebruiken die onderdeel zijn van de DBMS_JOB package: procedure CHANGE Je kan met het aanroepen van de procedure DBMS_JOB.CHANGE de "user-definieerbare" parameters die aan een job hangen, aanpassen. In dit voorbeeld zal de job met job_id 14144 iedere 3 dagen uitgevoerd worden: SQL>DBMS_JOB.CHANGE(14144, null, null, 'SYSDATE + 3'); Als je NULL specificeert voor WHAT, NEXT_DATE, of INTERVAL bij de aanroep van de CHANGE procedure, dan zal de huidige waarde onaangetast blijven.
Let Op: Als je met de CHANGE procedure de WHAT parameter aanpast, zal Oracle je huidige omgeving registreren. Dit zal de nieuwe omgeving voor de job worden. procedure WHAT Deze procedure wordt gebruikt om de job definitie aan te passen. DBMS_JOB.WHAT( job IN BINARY_INTEGER, what IN VARCHAR2); procedure NEXT_DATE De NEXT_DATE procedure wordt gebruikt om de next date dat Oracle een job uitvoert:
DBMS_JOB.NEXT_DATE( job IN BINARY_INTEGER, next_date IN DATE)
procedure INTERVAL De INTERVAL procedure wordt gebruikt om de interval tussen de uitvoer van een specifieke job te zetten. DBMS_JOB.INTERVAL( job IN BINARY_INTEGER, interval IN VARCHAR2) Voorwaarden: je kan alleen jobs aanpassen waarvan je de eigenaar bent. Als je probeert om een job aan te passen waarvan je niet de eigenaar bent, krijg je de melding dat de job niet in de job queue staat. Broken JobsEen job kan het label broken of niet broken hebben. Oracle zal niet proberen om broken jobs uit te voeren. Je kan echter een broken job wel dwingen om uit te voeren door de volgende procedure DBMS_JOB.RUN aan te roepen. Een Job dwingen om uitgevoerd te wordenHet komt wel een voor dat je een job handmatig wil uitvoeren. Als je bijvoorbeeld een job hebt gerepareerd die op broken stond dan wil je wellicht de job gelijk even testen. Dit kan je doen met de de RUN procedure in de DBMS_JOB package. Als je een job uitvoert met DBMS_JOB.RUN, zal Oracle de volgende uitvoer datum uitrekenen. Als je bijvoorbeeld een job op Maandag maakt met een NEXT_DATE waarde van 'SYSDATE' en een INTERVAL waarde van 'SYSDATE + 7', dan zal de job iedere 7 dagen op Maandag starten. Echter als je op Woensdag de RUN uitvoerd zal de volgende uitvoerdag ook Woensdag zijn. Het volgende statement zal job 14144 in je huidige sessie uitvoeren en de volgende utvoer datum berekenen: SQL>DBMS_JOB.RUN(14144); Voorwaarden: - je kan alleen jobs aanpassen waarvan je de eigenaar bent. Als je probeert om een job aan te passen waarvan je niet de eigenaar bent, krijg je de melding dat de job niet in de job queue staat. - De RUN procedure betekent ook een implicite commit. Als je met de RUN procedure een job uitvoert kan deze noiet met roll back teruggedraaid worden. Hoe een Job op Broken komt te staan Als je een job toevoegt aan de job queue wordt aangenomen dat deze niet broken is. Er zijn 2 manieren waarop een een job op broken kan komen te staan: - Het is Oracle niet gelukt om een job succesvol uit te voeren na 16 keer proberen.
- Je hebt de job als broken gemarkeerd met de DBMS_JOB.BROKEN procedure:
Procedure BROKEN DBMS_JOB.BROKEN( job IN BINARY_INTEGER, broken IN BOOLEAN, next_date IN DATE);
Als een job eenmaal als broken staat gemarkeerd, zal Oracle niet proberen de job uit te voeren tot dat je de job markeert als zijnde niet broken, of door het het forceren van de job uitvoer met de DBMS_JOB.RUN procedure. Het volgende voorbeeld markeert job 14144 als niet broken en zet de "next execution date" van de job naar de volgende Maandag: DBMS_JOB.BROKEN(14144, FALSE, NEXT_DAY(SYSDATE, 'MONDAY')); Voorwaarden: Je kan alleen jobs aanpassen waarvan je de eigenaar bent. Als je probeert om een job aan te passen waarvan je niet de eigenaar bent, krijg je de melding dat de job niet in de job queue staat. Het Runnen van Broken Jobs Als een probleem er voor heeft gezorgd dat een job 16 keer fout gaat, zal Oracle de job op broken zetten. Als je het probleem hebt opgelost kan je de job uitvoeren met: - Forceer de job om uit te voeren met DBMS_JOB.RUN.
- Markeer de job als niet broken met DBMS_JOB.BROKEN en wacht tot Oracle de job uitvoert.
Als je de job dwingt uit te voeren met de DBMS_JOB.RUN procedure, zal Oracle de job gelijk uit voeren. Als de job succesvol heeft gelopen, zal Oracle de job op niet broken zetten en het aantal FAILURES op nul zetten. Als je de de label van een job reset (dan wel via de RUN dan wel via de BROKEN procedure), zal de job uitvoer volgens het schedule van de job doorgaan. Hoe Jobs Uitgevoerd worden SNP achtergrond processen voeren jobs uit. Om een job uit te voeren zal het proces een sessie creƫren. Als een SNP proces een job uitvoert, zal de job in dezelfde omgeving lopen als waarin hij aan de job qeueu was toegevoegd en met de default privileges van de eigenaar van de job. Als je een job forceert om uit te voeren met de DBMS_JOB.RUN procedure zal de job uitgevoerd worden door je users proces. Wanneer je user proces de job uitvoert zal het alleen met je default privileges uitgevoerd worden. Privileges die via rollen zijn toegekend zijn niet beschikbaar. Job Queue Locks Oracle gebruikt job queue locks om er zeker van te zijn dat een job een maal per sessie uitgevoerd wordt. Als een job aan het uitvoeren is, heeft zijn sessie een job queue (JQ) nodig voo reen lock voor die job. Je kan de locking views in de data dictionary gebruiken om informatie te bekijken over locks die op dit moment vast gehouden worden door sessies. De volgende query laat de sessie id, type lock en lock id voor alles sessies zien die JQ locks vasthouden: SELECT sid, type, id1, id2 FROM v$lock WHERE type = 'JQ'; SID TY ID1 ID2 --------- -- --------- --------- 12 JQ 0 14144 1 row selected.e In bovenstaande query is het id voor de sessie die de lock vasthoud, 12. De ID1 voor de lock is altijd 0 voor JQ locks. De ID2 lock id is het job number van de job waar de sessie voor loopt. Deze view kan gejoined met de DBA_JOBS_RUNNING view om nog meer informatie over de job te zien te krijgen. Zie "Het bekijken van Job Queue informatie" voor mee informatie over views. Job uitvoer fouten Als een job fout gaat, wordt informatie olver de fout opgeslagen in een trace file en de alert.log. Oracle schrijft een ORA-12012 en voegt het job nummer van de job die fout gegaan is bij.
De volgende omstandigheden kunnen er voor zorgen dat een job niet succesvol uitgevoerd wordt: - Er is geen SNP achtergrond proces om de job uit te voeren.
- Een netwerk of instance fout.
- Een Exeption als de job uitgevoerd wordt
Als een job met een foutmelding terugkomt als Oracle deze probeert uit te voeren, zal Oracle het nogmaals proberen. De eerste keer na een minuut, de tweede poging na 2 minuten, de derde na 4 minuten. Zo gaat het door met een verdubbeling van het aantal minuten. Als het opnieuw proberen de oorspronkelijke interval overschrijdt, zal de oorspronkelijke interval weer ingaan. Echter na 16 mislukte pogingen zal de job op broken komen te staan. Let op: Als er 1 SNP proces is en de JOB_QUEUE_INTERVAL staat bijvoorbeeld op 600 (10 minuten) en een job heeft een interval van 3 minuten, dan zal het SNP proces pas na 10 minuten wakker worden. Bij een retry zal dus iedere 10 minuten de job uitgevoerd worden.
Als je het probleem dat het fout gaan van de job uitvoer veroorzaak dus oplost, voordat de job 16 keer is fout gegaan, dan zal Oracle de job weer uitvoeren. Job Definitie De job definitie is de PL/SQL code die in de WHAT parameter van de SUBMIT procedure is gespecificeerd. Normaal gesproken is de job definitie een enkele aanroep naar de procedure. De aanroep kan een willekeurig aantal parameter. Let op: In de job definitie, gebruik je 2 enkele quotes om de string. Voeg altijd een semicolon toe aan het eind van de job definitie.
|