이번에 오라클로 인터페이스 작업을 하게 됬다. 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을 오라클의 스케줄러로 관리하여 스케줄러만 관리하면 되도록 구성
'프로그래밍 > DBMS' 카테고리의 다른 글
오라클 스케줄러 로그 확인 쿼리 (0) | 2011.07.05 |
---|---|
오라클 스케줄러, Toad 사용하기 (0) | 2011.06.22 |
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다 (2) | 2011.06.14 |
오라클 MERGE INTO - 한번에 INSERT, UPDATE 하기 (4) | 2011.06.03 |
toad로 오라클 연결하기 (0) | 2011.03.16 |
[MSSQL] DB에 속한 테이블명 알아내기 (0) | 2011.01.03 |
[MSSQL] Create Function (0) | 2010.12.08 |
[MSSQL] 문자열 Substring (0) | 2010.12.08 |