RadarURL

오라클 스케쥴러 사용법 및 개념 정리

by JAESOO posted Jul 22, 2014
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

처음 오라클 스케쥴러 사용하려고 하면서 가장 헷갈렸던건 ORACLE JOB ORACLE SCHEDULER 이다

ORACLE JOB은 PLSQL_BLOCK, STORED_PROCEDURE만 구동된다고 한다.

오라클 10g에서부터 ORACLE SCHEDULER ?를 지원?한다.


ORACLE JOB ORACLE SCHEDULER ?가장 큰 차이점이라면 

OS상의 crontab에 등재되는 shell프로그램도 ORACLE SCHEDULER 에서 돌릴 수 있다는 점.



오라클스케쥴러 등록을 위한 권한은 다음과 같다.

 - GRANT CREATE ANY JOB TO 계정명;

 

ORACLE SCHEDULER 

 

이것도 개인적으로 헷갈렸던거..

오라클 스케쥴러에는 다음과 같은 명령어가 있다.


1. DBMS_SCHEDULER.CREATE_PROGRAM

 - 잡이 스케쥴러에 맞게 돌면서 실제로 동작하는 프로그램(외부의 shell이나 SP, PLSQL_BLOCK 등) 을 등록한다. 


2. DBMS_SCHEDULER.CREATE_SCHEDULER

 - 주기적으로 돌아갈 스케쥴을 등록 한다


3. DBMS_SCHEDULER.CREATE_JOB

 - 수행할 작업을 등록한다. 


사용 절차
 

1. 동작할 프로그램 등록
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'STATS_MAIN_BATCH_PROGRAM',
program_action => 'STATS_MAIN_BATCH',
program_type => 'STORED_PROCEDURE',
comments => 'Service desk stats main batch program',
enabled => TRUE);
END;

2014.03.10 - 매개변수 사용하는 경우가 있어서 추가함.
1-1. 매개변수가 있는 경우
BEGIN
   DBMS_SCHEDULER.CREATE_PROGRAM (
       PROGRAM_NAME => 'STATS_MAIN_BATCH_PROGRAM'
      ,PROGRAM_TYPE => 'STORED_PROCEDURE'
      ,PROGRAM_ACTION => 'STATS_MAIN_BATCH'
      ,NUMBER_OF_ARGUMENTS => 1
      ,ENABLED => FALSE
      ,COMMENTS => 'SERVICE DESK STATS MAIN BATCH PROGRAM');
      
   DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (
       PROGRAM_NAME => 'STATS_MAIN_BATCH_PROGRAM'
      ,ARGUMENT_POSITION => 1
      ,ARGUMENT_NAME => 'I_DT'
      ,ARGUMENT_TYPE => 'VARCHAR2'
      ,DEFAULT_VALUE => 'TO_CHAR(SYSDATE-1, ''YYYYMMDD'')'
    );
   DBMS_SCHEDULER.ENABLE(NAME => 'STATS_MAIN_BATCH_PROGRAM');
END;


/*-------------------------------------------------------------------------------------------------------------------
program_name: 프로그램이름
program_action: 실제 액션이 일어나는 SP(미리 등록되어있어야 한다). 여기서 shell 프로그램등을 돌릴 수도 있다.
program_type: SP 라고 명시
number-of_arguments: 사용할 인수 개수
comments: 코멘트.부가설명
enabled: 사용가능 설정
argument_position: 몇번째 인수인지
argument_name: 인수이름
argument_type: 인수타입
argument_value: 인수값
--------------------------------------------------------------------------------------------------------------------*/



2. 스케쥴 등록
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE(
schedule_name => 'SCHEDULE_DAILY_AM_3_HOUR',
start_date       => TRUNC(SYSDATE)+1 +3/24, 
end_date        => null,
repeat_interval => 'FREQ=DAILY;INTERVAL=1',
comments => 'Every AM 03 HOUR');
END;
/*-------------------------------------------------------------------------------------------------------------------
schedule_name: 스케쥴 이름
start_date: 스케쥴이 작동을 시작 할 시각. 입력한 시점부터 스케쥴러가 시작된다. AM 03시로 설정함
end_date: 스케쥴이 작동을 멈출 시간.
repeat_interval: 스케쥴이 작동하는 주기. 하루 한번 돌게 설정 매일 AM 03시에 동작함.
comments: 부가설명
--------------------------------------------------------------------------------------------------------------------*/

3. JOB 등록, 실제 수행 될 작업으로 스케쥴러와 프로그램을 명시해준다.
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name =>'STATS_MAIN_BATCH_JOB',
program_name =>'STATS_MAIN_BATCH_PROGRAM',
schedule_name =>'SCHEDULE_DAILY_AM_3_HOUR',
comments => 'Service desk stats main batch program',
--job_class =>'SCHEDULER_JOB_CLASS',
enabled =>TRUE);
END;
/*-------------------------------------------------------------------------------------------------------------------
job_name: 작업이름
program_name: 구동 될 프로그램이름 명시. 위에서 등록한 프로그램이름을 적어준다.
schedule_name: 어떤 스케쥴러가 돌면서 이 작업을 수행 할 것인가. 위에 등록한 스케쥴러이름을 적어준다.
job_class: JOB을 Class 라는 단위로 그룹핑해서 관리한다. 많은 양의 스케쥴러 관리를 위해 추가 할 수 있다.
하지만 잘 모르니까 난 안쓴다.
enabled: 사용가능 설정
comments: 코멘트.부가설명
--------------------------------------------------------------------------------------------------------------------*/

4. 삭제

execute dbms_scheduler.drop_job('FRG_BALANCE_HIST_UPDATE_JOB',false); 

execute dbms_scheduler.drop_program('FRG_BALANCE_HIST_UPDATE_PRG',false);
execute dbms_scheduler.drop_schedule('SCHEDULE_30_MIN',false);

2014.03.10 - excute 구문 이거 실행이 안되네???? 다시 수정한다. pl/sql developer라 그런듯.


job먼저 지우고 program 지운다. program 먼저 지우려고 하면 종속된 객체라면서 안지워짐.

스케쥴은 안지워봤음.. 스케쥴도 동일하게 하면 지워지겠지??

BEGIN

   DBMS_SCHEDULER.DROP_JOB(

        JOB_NAME   => 'STATS_MAIN_BATCH_JOB',

        FORCE      => FALSE);

END;


BEGIN

   DBMS_SCHEDULER.DROP_PROGRAM(

        PROGRAM_NAME   => 'STATS_MAIN_BATCH_PROGRAM',

        FORCE          => FALSE);

END;



5. 등록 정보 확인
SELECT * FROM USER_SCHEDULER_JOBS; --등록된 job
SELECT * FROM USER_SCHEDULER_JOB_ARGS; --job의 arguments
SELECT * FROM USER_SCHEDULER_RUNNING_JOBS; --현재 running중인 job들의정보
SELECT * FROM USER_SCHEDULER_JOB_LOG; --job의 log
SELECT * FROM USER_SCHEDULER_JOB_RUN_DETAILS; --job의수행된정보및Error 정보
SELECT * FROM USER_SCHEDULER_PROGRAMS; -- 등록된 Program
SELECT * FROM USER_SCHEDULER_PROGRAM_ARGS; -- 프로그램의 매게변수
SELECT * FROM USER_SCHEDULER_SCHEDULES; --등록된 스케쥴러


 

 

참고사항

 

 

1. JOB_CLASS 설정
BEGIN
DBMS_SCHEDULER.CREATE_JOB_CLASS (
job_class_name =>'SCHEDULER_JOB_CLASS',
logging_level =>DBMS_SCHEDULER.LOGGING_FULL,
log_history =>1,
comments =>'SCHEDULER_JOB_CLASS');
END; 


2. 위의 내용은 PROGRAM, SCHEDULE, JOB 세 개로 세분화하여 등록하는 형태이다.

하지만 세개 모두 등록하지 않고 CREATE_JOB 한 개만 등록하여 사용하는 방법도 있다.

실제로 select * from user_scheduler_jobs; 으로 테이블을 살펴보면 

CREATE_PROGRM에서 사용했던  program_type, program_action과 같이

job_type, job_action 컬럼이 존재하고

CREATE_SCHEDULE에서 사용했던 start_date, end_date, repeat_interval이 존재한다.

아마도 JOB 생성시 다 같이 작성하여 등록하고 사용하는것으로 보인다.

 

자세한건 자료를 더 찾아봐야겠다.

 

 


참고: http://bosoa.egloos.com/3875160

 

 

 

API 잘나와있구나... 

스케쥴러 변경같은 경우 이거  참조하면 되겠음.


http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sched.htm



출처 : http://www.semtlenara.com/?mid=board_VZlj29&document_srl=1748&listStyle=viewer