본문 바로가기
프로그래밍/DBMS

오라클 Job을 테스트하자.

by zoo10 2011. 4. 14.

이번에 오라클로 인터페이스 작업을 하게 됬다. Job으로 프로시져를 실행시키는 작업을 해야 할 것 같아서 테스트를 진행해 봤다.

win 7 x86 + 오라클 10g + 토드 9.0.1 으로 작업했다.
하단 스크립트들은 모두 토드의 마법사로 만든 것이다. 엑셀에 정리한 내용을 옮겨왔더니 무지막지하게 보기 싫어져 버렸다.

테스트 시나리오 
테스트를 진행하기 전 가상의 시나리오를 생성한다. 
 
1. 테이블을 생성한다. 
 테이블명은 test_schedule
 필드구성은 일련번호, 비고, 입력일시로 간단하게 구성
 일련번호는 시퀀스이고 시퀀스명은 SQ_TEST_SCHEDULE 임
 sql 스크립트를 백업한다.
 
2. 프로시져 생성 
 프로시져명은 sp_test_schedule_ins
 test_schedule 테이블에 insert 하는 프로시져
 비고는 고정 텍스트
 입력일시에는 입력 당시의 일시(sysdate)
 프로시져를 실행하여 데이터 처리가 정상인지 확인한다.
 
3. 오라클 스케줄러 잡을 구성한다. 
 1분 6회만 실행되도록 처리한다.
 10초에 한번씩 sp_test_schedule_ins 를 호출한다.
 
4. 결과를 확인한다. 

시퀀스 스크립트

CREATE SEQUENCE LIMS_YS.SQ_TEST_SCHEDULE
START WITH 1
INCREMENT BY 1
MINVALUE 1
NOCACHE
NOCYCLE
NOORDER

테이블 스크립트

CREATE TABLE LIMS_YS.test_schedule
(
  seq       NUMBER,
  memo      VARCHAR2(10)                        DEFAULT '입력',
  ins_date  DATE                                DEFAULT sysdate 
)

LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
NOMONITORING;

COMMENT ON COLUMN LIMS_YS.test_schedule.seq IS '일련번호';
COMMENT ON COLUMN LIMS_YS.test_schedule.memo IS '비고';
COMMENT ON COLUMN LIMS_YS.test_schedule.ins_date IS '입력일시';


ALTER TABLE LIMS_YS.test_schedule ADD (
  CONSTRAINT test_schedule_PK
 PRIMARY KEY
 (seq));

프로시져 스크립트

CREATE OR REPLACE PROCEDURE sp_test_schedule_ins IS     
          
/******************************************************************************          
 NAME: sp_test_schedule_ins        
 PURPOSE: 오라클 job 테스트용, test_schedule 테이블에 데이터 insert  
          
 REVISIONS:         
 Ver Date Author Description      
 --------- ---------- --------------- ------------------------------------      
 Created this procedure.    
          
 NOTES:         
          
 Automatically available Auto Replace Keywords:     
 Object Name: sp_test_schedule_ins       
 Sysdate: 
 Date and Time: 
 Username: 
 Table Name: test_schedule       
          
******************************************************************************/          
BEGIN          
 insert into test_schedule values(sq_test_schedule.nextVal, '비고', sysdate);    
-- EXCEPTION         
-- WHEN NO_DATA_FOUND THEN       
-- NULL;         
-- WHEN OTHERS THEN       
 -- Consider logging the error and then re-raise  
-- RAISE;         
END sp_test_schedule_ins;

Job 스크립트

DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
    ( job       => X
     ,what      => 'LIMS_YS.SP_TEST_SCHEDULE_INS;'
     ,next_date => to_date('01-01-4000 00:00:00','dd/mm/yyyy hh24:mi:ss')
     ,interval  => 'TRUNC(SYSDATE)+1/8640'
     ,no_parse  => TRUE
    );
  SYS.DBMS_JOB.BROKEN
   (job    => X,
    broken => TRUE);
  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
END;
/

commit;

테스트 결과

테스트 결과서        
           
테스트 진행을 위한 스크립트를 모두 생성한 후 진행된 테스트 결과를 기술한다.
           
1. Job 실행결과        
  select * from test_schedule where rownum <= 10    
  order by seq desc       
           
  결과        
  SEQ MEMO INS_DATE    
  67 비고 2011-04-13 오전 11:42:05    
  66 비고 2011-04-13 오전 11:41:55    
  65 비고 2011-04-13 오전 11:41:45    
  64 비고 2011-04-13 오전 11:41:35    
  63 비고 2011-04-13 오전 11:41:25    
  62 비고 2011-04-13 오전 11:41:15    
  61 비고 2011-04-13 오전 11:41:05    
  60 비고 2011-04-13 오전 11:40:55    
  59 비고 2011-04-13 오전 11:40:45    
  58 비고 2011-04-13 오전 11:40:35    
           
2. 결과          
  Job을 실행하면 10초에 한번씩 데이터가 insert 되는 것을 확인함  

 

문제점 및 해결방안

 
문제점 
 
1.  오라클의 Job 패키지는 원하는 시간에 정확히 실행이 되지 않는다.
 몇 초정도 뒤로 밀려서 실행이 되는 경우가 많은데 짧은 주기로 수행을
 해야하는 조건에서는 문제가 될 수 있다.
 수행 주기가 10초 단위가 지속적으로 유지되지 못하고 10~14초 사이를
 왔다갔다 하는 현상이 발생할 수 있다.
 예) 12:00:00 에 실행되야 하는 Job이 실제로는 12:00:04 에 실행된다.
 
2.  Job 수행이 16번 실패하면 Broken 상태가 되어 관리자가 명시적으로
 Run 명령을 수행해야 관련 Job이 다시 수행된다.
 
3.  수행해야 할 업무가 많을 경우(많은 인터페이스 작업과 같은) 아주 많은
 Job을 만들어내야 하기 때문에 관리의 어려움이 있을 수 있다.
 
 
해결방법 
 
1.  수행 주기가 민감하지 않다면 큰 문제는 아님
 최소 단위를 분으로 하고 Trunc() 함수를 사용하여 분단위를 잘 맞추면
 정확한 시간에 실행이 된다고 함
 
2.  Broken 상태를 체크하여 Run 시켜주는 작업을 할 수 있음
 관련 문서를 찾아 그에 맞게 작업해야 함
 
3.  Job 관리 문서를 작성
 Job을 오라클의 스케줄러로 관리하여 스케줄러만 관리하면 되도록 구성