본문 바로가기
Oracle(DB관련)

ORACLE SCHEDULER

by xfree302 2017. 7. 13.
반응형

ORACLE SCHEDULER


DBMS_SCHEDULER 패키지


개선판이라기보다는 완전히 새로 추가된 패키지

DBMS_JOB - 특정 시간 및 간격으로 특정 작업을 수행

DBMS_SCHEDULER - 매우 복잡하고 정교한 수준의 스케줄 작업 가능

DBMS_SCHEDULER 의 장점

GUI(EM)을 통해서 손쉬운 관리

모듈화된 스케줄 오보젝트를 통해서 쉽게 공유할수 있다. ( 프로그램, 스케줄, 잡 )

모든 스케줄 활동이 기록된다.

TimeZone 이 지원된다.

디비간 이동시 손쉽다(By DataPump)


● 프로그램(Program)

실행 가능한 프로그램(Program)을 말함

DBMS_JOB 은 PL/SQL 블록, 저장 프로시저(Stored Procedure)만 가능

DBMS_SCHEDULER는 외부 프로그램까지 사용 가능

( PL/SQL 블록, 저장 프로시저(Stored Procedure), 실행 파일(Executable, Unix Shell, Windows 실행 파일) )

DBMS_SCHEDULER.CREATE_PROGRAM 프로시져를 통해 등록 가능하며

[ALL/DBA/USER]_SCHEDULER_PROGRAMS 뷰를 통해서 확인 가능

스케줄렁에 의해서 실행 되는 무엇( 프로그램 이름, 타입, Argument 갯수 등 )


● 스케줄(Schedule)

작업을 수행할 스케줄을 말함.

작업 시작 시간, 종료 시간, 간격 등을 지정할 수 있다.

DBMS_JOB에 비해 유연함

EX ) "FREQ=YEARLY; BYMONTH=4; BYMONTHDAY=15; BYHOUR=9; BYMINUTE=0; BYSECOND=0"

매년 4월 15일 9시에 작업 수행

DBMS_SCHEDULER.CREATE_SCHEDULE 프로시져를 통해 등록 가능하며

[ALL/DBA/USER]_SCHEDULER_SCHEDULES 뷰를 통해서 확인 가능

★WHEN / HOW MANY 에 대한 정의

#. USING PL/SQL Expression 

: repeat_interval =>'sysdate+36/24'

#. Using Calendar Expression

: i) repeat_interval => 'FREQ=HOURLY;INTERVAL=4' ( Indiates a repeat interval of every four hours ) 

ii) repeat_interval => 'FREQ=YEARLY;BYMONTH=MAR,JUN,SEP,DEC;BYMONTH=15'

( indicate as repeat interval of every year on Mar 15th, Jun 15th, Sep 15th and Dec 15th )


● 작업(Job)

주어진 프로그램과 스케줄에 따라 수행할 작업을 말함 ( 언제 무엇을 )

명시적으로 생성된 프로그램과 스케줄을 이용할 수도 있고,

작업을 생성하면 암묵적인 프로그램과 스케줄을 생성할 수도 있다.

DBMS_SCHEDULER.CREATE_JOB 프로시져를 통해 등록 가능하며

[ALL/DBA/USER]_SCHEDULER_JOBS 뷰를 통해 확인 가능

작업이 수행되면서 남는 로그 데이터는 [ALL/DBA/USER]_SCHEDULER_JOB_LOG 뷰나

[ALL/DBA/USER]_SCHEDULER_JOB_RUN_DETAILS 뷰를 통해 확인 가능


● 작업 클래스(Job Class)

작업의 공통 속성을 묶어서 만든 분류를 말한다.

Resouce Consumer Group, Service, Logging Level, Log History 의 속성을 조합해서 하나의 클래스 생성 한다.

Resource Consumer Group 은 DBMS_RESOURCE_MANGER 패키지를 통해서 생성,

말 그대로 자원을 얼마나 사용 가능하게 할지를 지정

Service는 작업이 특정 서비스에 대한 리소스 친화도(Resource Affinity)를 가지도록 지정

[ Service는 RAC 에서 클러스터 내의 여러 노드를 묶은 논리적인 그룹 ]

Logging Level 은 작업 실행에 대한 로그 데이터의 레벨을 지정

Log History 는 로그 데이터를 얼마나 저장할 지를 지정한다

같은 작업 클래스에 속하는 작업은 같은 속성을 공유하기 때문에 관리상의 편의점을 제공

하나의 JOB 은 하나의 JOB CLASS 에만 속함


● 윈도우(Window)

특정 리소스 플랜(Resoure Plan)을 적용하는 시간 단위를 의미

리소스 플랜은 오라클이 자원을 관리하는 단위로, 작업의 종류에 따라 CPU 등의 자원을 얼마나 부여할 지를 지정하는 역할

( 윈도우를 지정하면 해당 윈도우 안에서 실행되는 작업은 윈도우 생성시 지정한 리소스 플랜을 사용하게 된다


● 체인(Chain )

프로그램의 집합을 의미 한다. 일련의 프로그램들을 순서대로 수행하고자 할 경우에 사용한다.

체인은 오라클 10g R2 에서 추가된 기능

스케줄작업과 RAC Instance

DBMS_JOB ==> 작업을 실행할 인스턴스 번호를 지정 // 한노드로 지정 시에 좀 더 편리

DBMS_SCHEDULER => Instance_Stickness 라는 개념을 통해 좀 더 지능적으로 인스턴스를 할당

INSTANCE_STICKSNESS = TRUE ( DBMS_SCHEDULER.SET_ATTRIBUTE ) 의미

작업 수행 시 현재 가장 부하가 적은 인스턴스에 작업을 분배 한다.

이후 작업 수행 시에는 가능한 최초에 지정된 인스턴스에서 작업을 수행하도록 한다.

이 매커니즘을 일컬어 인스턴스 접착도라고 하며 리소스 친화도를 구현하는 방법

최초에 지정된 인스턴스가 다운되거나, 부하가 심해서 작업을 수행할 수 없을 경우 다른 인스턴스에서 작업을 수행

만일 INSTANCE_STICKNESS 속성 값이 FALSE 이면 오라클은 인스턴스 순서대로 작업을 수행한다.

즉, DBMS_JOB 패키지를 이용해 작업을 수행하되 인스턴스 번호를 지정하지 않은 경우와 거의 같은 방식으로 작동한다.

스케즐 등록 해보기


-- 샘플 테이블 생성

CREATE TABLE CHECK_SCHEDULE 

( INST_ID NUMBER, ACT_DATE DATE DEFAULT SYSDATE, ACT_DESC VARCHAR2(100)) ;


-- 샘플 프로시져 생성

CREATE OR REPLACE PROCEDURE OPS$ORACLE.DO_SCHEDULE_PROG

IS

  V_SID NUMBER ;

  V_INST NUMBER ; 

BEGIN 

     SELECT INSTANCE_NUMBER INTO V_INST FROM V$INSTANCE  ; 

     INSERT INTO CHECK_SCHEDULE ( INST_ID, ACT_DATE,  ACT_DESC ) VALUES ( V_INST, SYSDATE, 'DO SCHEDULEING') ;

END ;     

      


-- 스케줄 등록

EXEC DBMS_SCHEDULER.CREATE_SCHEDULE(schedule_name=>'CHK_SCHE',repeat_interval=>'FREQ=MINUTELY');


-- 스케줄 확인

SELECT SCHEDULE_NAME, REPEAT_INTERVAL  

FROM DBA_SCHEDULER_SCHEDULES 

WHERE OWNER ='OPS$ORACLE' AND SCHEDULE_NAME='CHK_SCHE';



SCHEDULE_NAME REPEAT_INTERVAL

CHK_SCHE FREQ=MINUTELY



-- 프로그램 등록

EXEC DBMS_SCHEDULER.CREATE_PROGRAM(PROGRAM_NAME=>'DO_SCHEDULE_PROGRAM',PROGRAM_TYPE=>'STORED_PROCEDURE',PROGRAM_ACTION=>'DO_SCHEDULE_PROG');


-- 프로그램 Enable 

EXEC DBMS_SCHEDULER.ENABLE('DO_SCHEDULE_PROGRAM');


-- 프로그램 등록 확인


SELECT PROGRAM_NAME, PROGRAM_ACTION, ENABLED 

FROM DBA_SCHEDULER_PROGRAMS 

WHERE OWNER ='OPS$ORACLE' AND PROGRAM_NAME='DO_SCHEDULE_PROGRAM';


PROGRAM_NAME PROGRAM_ACTION ENABLED

DO_SCHEDULE_PROGRAM DO_SCHEDULE_PROG TRUE


-- 잡 등록

EXEC DBMS_SCHEDULER.CREATE_JOB(JOB_NAME=>'CHK_SCHE_JOB' ,PROGRAM_NAME=>'DO_SCHEDULE_PROGRAM' ,SCHEDULE_NAME=>'CHK_SCHE' ,AUTO_DROP=>FALSE);


-- 잡 Enable 

EXEC DBMS_SCHEDULER.ENABLE('CHK_SCHE_JOB'); 


-- 잡 등록 확인

SELECT JOB_NAME, PROGRAM_NAME, SCHEDULE_NAME, ENABLED 

FROM DBA_SCHEDULER_JOBS 

WHERE OWNER ='OPS$ORACLE' AND JOB_NAME='CHK_SCHE_JOB';


JOB_NAME PROGRAM_NAME SCHEDULE_NAME ENABLED

CHK_SCHE_JOB DO_SCHEDULE_PROGRAM CHK_SCHE TRUE



-- 작업 결과 확인

SELECT LOG_DATE, ACTUAL_START_DATE, JOB_NAME, STATUS  

FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME ='CHK_SCHE_JOB';


LOG_DATE ACTUAL_START_DATE JOB_NAME STATUS

2011/04/20 13:36:02.127937 +09:00 2011/04/20 13:36:02.087344 +09:00 CHK_SCHE_JOB SUCCEEDED

2011/04/20 13:37:01.223407 +09:00 2011/04/20 13:37:01.209592 +09:00 CHK_SCHE_JOB SUCCEEDED

2011/04/20 13:38:01.127528 +09:00 2011/04/20 13:38:01.110444 +09:00 CHK_SCHE_JOB SUCCEEDED


-- 실제 결과 확인

SELECT * FROM CHECK_SCHEDULE ;

INST_ID ACT_DATE ACT_DESC

1 2011/04/20 13:36:02 DO SCHEDULEING

1 2011/04/20 13:37:01 DO SCHEDULEING

1 2011/04/20 13:38:01 DO SCHEDULEING

1 2011/04/20 13:39:01 DO SCHEDULEING

1 2011/04/20 13:40:01 DO SCHEDULEING







출처

http://wiki.gurubee.net/pages/viewpage.action?pageId=7667772


반응형

'Oracle(DB관련)' 카테고리의 다른 글

오라클 10g 함수  (0) 2017.07.31
Oracle TABLE 정보관련 및 VIEW  (0) 2017.07.17
oracle listener ip  (0) 2017.07.13
oracle 주간 일요일~월요일, 전년 동요일  (0) 2017.07.07
oracle select update  (0) 2017.06.15