Hurriyet

13 Ağustos 2013 Salı

Oracle Veritabanı: DBMS_JOB Paketi - Kullanılması - JOB Yarartılması

DBMS_JOB paketi kullanıcıya belirli işlerin programlanması ve zamanlarının ayarlanması bunun sonucunda belirli zamanlarda çalıştırılmasını sağlar. Bir job atanınca bu görev kuyruğa(queue) girer ve gerektiği zamanda çalışır. Bu işlere gerektiğinde parametrelerde atanabilir. DBMS_JOB kullanımıyla ilgili syntax bilgilerine ayrıca $ORACLE_HOME/rdbms/admin/dbmsjob.sql  dosyasına da bakabiliriz.

DBMS_JOB paketiyle işi oluşturan kişi görevin sahibi olarak belirlenir. Bu job'in sahibi olarak görevi değiştirebilecek tek kişidir. Bu job'larla ilgili bilgi edinmek istediğimizde bakılabilecek belirli tablolar vardır.
Bunlar:

  • DBA_JOBS
  • ALL_JOBS
  • USER_JOBS
  • DBA_JOBS_RUNNING
  • USER_JOBS_RUNNING
  • SYS.SCHEDULER$_JOB
  • DBA_SCHEDULER_JOB
  • ALL_SCHEDULER_JOB_RUN_DETAILS


DBMS_JOB SCHEDULE Değiştirilmesi:

DBMS_JOB.CHANGE prosedürü tanımladığımız işin zamanını ve diğer özellikleri değiştirebilir.

 DBMS_JOB.CHANGE  
  job    IN BINARY_INTEGER, --Çalıştırılacak Job Numarası  
  what   IN VARCHAR2, -- Çalıştırılacak PL/SQL kodu  
  next_date IN DATE, --Gelecek Çalıştırılma Zamanı   
  interval IN VARCHAR2, --İş Çalıştıktan Sonraki Gelecek Çalıştırılmaya Kadarki Aralık  
  instance IN BINARY_INTEGER DEFAULT NULL,  
  force   IN BOOLEAN DEFAULT FALSE);  

Zaman Aralıklarının Belirtilme Şekilleri,

 Her gün çalışsın:                     'SYSDATE + 1'
 Haftada bir çalışsın:                'SYSDATE + 7'
 Her saat başında çalışsın:        'SYSDATE + 1/24'
 10 dakikada bir çalışsın:         'SYSDATE + 10/1440'
 30 saniyede:                           'SYSDATE + 30/86400'
 Bir daha çalışmasın:                'NULL'

DBMS_JOB.WHAT:             Job'ın içeriğini değiştirebilen prosedür.

DBMS_JOB.NEXT_DATE: Job'ın gelecek çalışma zamanını değiştiren prosedür.

Ör:
 DBMS_JOB.NEXT_DATE (JOB IN BINARY_INTEGER,  
  NEXT_DATE IN DATE);  

DBMS_JOB.INTERVAL:    Job'in çalışma aralığının değiştirilmesi.

Ör:
DBMS_JOB.INTERVAL (job IN BINARY_INTEGER,interval IN VARCHAR2);

DBMS_JOB.BROKEN:       Job'in bozulup bozulmadığının belirtilmesi. DBMS_JOB 16 kere bozuk çalışırsa veya broken olarak işaretliyse broken olarak gözükür. Bu prosedürde DBMS_JOB'ın bizim tarafımızdan broken gösterilmesi veya düzelttikten sonra broken statüsünde çıkartılmasını sağlar.

Ör:
 EXEC dbms_job.broken(jobno, FALSE);  

DBMS_JOB.RUN:                Job'in hemen çalıştırılması.

Ör:
 EXEC dbms_job.run(job_no);  

DBMS_JOB.REMOVE:       Job'in kaldırılması.

Ör:
 EXECUTE dbms_job.remove(job no );


Şu An Çalışan Job'larin Gösterilmesi:

 select  
 job                j,  
 to_char ( last_date, 'hh24:mi:ss' ) last,  
 to_char ( this_date, 'hh24:mi:ss' ) this,  
 to_char ( next_date, 'hh24:mi:ss' ) next,  
 broken              b,  
 failures             f,  
 interval,  
 what  
 from dba_jobs; 

Çalışmış Job'ların Detayları:

Burada çalışmış job'ların detayları yer alır. Fail edenlerle ilgili bilgiler gösterilir.


 select * from all_scheduler_job_run_details 

Hangi Sessionların Job Çalıştırdığının Görülmesi:

 select j.sid,  
 s.spid,  
 s.serial#,  
     j.log_user,  
     j.job,  
     j.broken,  
     j.failures,  
     j.last_date||':'||j.last_sec last_date,  
     j.this_date||':'||j.this_sec this_date,  
     j.next_date||':'||j.next_sec next_date,  
     j.next_date - j.last_date interval,  
     j.what  
 from (select djr.SID,  
        dj.LOG_USER, dj.JOB, dj.BROKEN, dj.FAILURES,  
        dj.LAST_DATE, dj.LAST_SEC, dj.THIS_DATE, dj.THIS_SEC,  
        dj.NEXT_DATE, dj.NEXT_SEC, dj.INTERVAL, dj.WHAT  
     from dba_jobs dj, dba_jobs_running djr  
     where dj.job = djr.job ) j,  
    (select p.spid, s.sid, s.serial#  
      from v$process p, v$session s  
      where p.addr = s.paddr ) s  
  where j.sid = s.sid;  

Schedule Edilmiş - Programlanmış Job'ların Görülmesi:

select j.log_user,  
    j.job,  
    j.broken,  
    j.failures,  
    j.last_date||':'||j.last_sec last_date,  
    j.this_date||':'||j.this_sec this_date,  
    j.next_date||':'||j.next_sec next_date,  
    j.next_date - j.last_date interval,  
    j.what  
 from (select dj.LOG_USER, dj.JOB, dj.BROKEN, dj.FAILURES,  
        dj.LAST_DATE, dj.LAST_SEC, dj.THIS_DATE, dj.THIS_SEC,  
        dj.NEXT_DATE, dj.NEXT_SEC, dj.INTERVAL, dj.WHAT  
     from dba_jobs dj) j;  

DBMS_JOB Örneği:

 variable jobno number;  
 variable instno number;  
 begin   
   select instance_number into :instno from v$instance;  
  dbms_job.submit(  
   :jobno, 'BEGIN statspack_alert_proc; END;',  
   trunc(sysdate)+6/24,  
   'trunc(SYSDATE+1/24,''HH'')',  
   TRUE,  
   :instno);  
 commit;  
 end  



1 yorum: