DBA가 되고 싶은 병아리

JOB, SCHEDULES 개념 정리(오라클 잡, 스케줄) (펌) 본문

Oracle Study/Oracle Engineer

JOB, SCHEDULES 개념 정리(오라클 잡, 스케줄) (펌)

미스틱스 2021. 4. 28. 13:25

2개 사이트 참조

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1.  http://blog.naver.com/livekim86?Redirect=Log&logNo=20206446657

 

처음 오라클 스케쥴러 사용하려고 하면서 가장 헷갈렸던건 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

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

2.  http://blog.naver.com/livekim86?Redirect=Log&logNo=20206446657

 

DBMS_SCHEDULER 패키지

  • 개선판이라기보다는 완전히 새로 추가된 패키지
  • DBMS_JOB - 특정 시간 및 간격으로 특정 작업을 수행
  • DBMS_SCHEDULER - 매우 복잡하고 정교한 수준의 스케줄 작업 가능

DBMS_SCHEDULER 의 장점

  1. GUI(EM)을 통해서 손쉬운 관리
  2. 모듈화된 스케줄 오보젝트를 통해서 쉽게 공유할수 있다. ( 프로그램, 스케줄, 잡 )
  3. 모든 스케줄 활동이 기록된다.
  4. TimeZone 이 지원된다.
  5. 디비간 이동시 손쉽다(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 ) 의미

  1. 작업 수행 시 현재 가장 부하가 적은 인스턴스에 작업을 분배 한다.
  2. 이후 작업 수행 시에는 가능한 최초에 지정된 인스턴스에서 작업을 수행하도록 한다.
    이 매커니즘을 일컬어 인스턴스 접착도라고 하며 리소스 친화도를 구현하는 방법
  3. 최초에 지정된 인스턴스가 다운되거나, 부하가 심해서 작업을 수행할 수 없을 경우 다른 인스턴스에서 작업을 수행
  4. 만일 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

문서정보

 

출처: <https://m.blog.naver.com/PostView.nhn?blogId=tttnnn1234&logNo=220190181975&proxyReferer=http:%2F%2Fm.blog.naver.com%2F>

'Oracle Study > Oracle Engineer' 카테고리의 다른 글

Flashback menual 10g  (0) 2015.01.13
Oracle 백업과 복구 (2 -1)  (0) 2014.11.06
Oracle 백업과 복구 (1)  (0) 2014.11.06
オラクル起動までのプロセス  (0) 2014.11.05
최근 시간표  (0) 2011.09.19