생계/Oracle2022. 3. 2. 21:49

DBMS_SCHEDULER 를 활용하면 서버에서 cron job 을 쓰지 않고, 정기적인 작업을 실행할수 있다. 

이것의 장점은 .. 

  - 굳이 서버에 접속하지 않고도 오렌지 같은 툴로 DB에만 접속해서 결과 확인이 가능. 

  - Active-stand by 구성된 경우 failover 되어 master 가 변경이 되는것에 신경 쓸 필요가 없다.

관리의 포인트가 DB 로 넘어온다는 것이 부담스럽긴 하지만 잘 애플리케이션 측면에서 활용도가 높으니 

알아두는 것이 좋다. 

 

1. 스케쥴 등록

BEGIN DBMS_SCHEDULER.CREATE_JOB(
  JOB_NAME => 'TEST.TEST_JOB',  --잡이름
  JOB_TYPE => 'PLSQL_BLOCK',   --PL/SQL로 만들어진 오브젝트 실행시 PLSQL_BLOCK를 지정
  JOB_ACTION => 'BEGIN TEST.PC_JOBTEST; END;',  --실행 할 오브젝트명 등록
  START_DATE => TO_DATE('2022/03/03 10:10:00','YYYY/MM/DD HH24:MI:SS'),  --실행을 시작 할 일시 지정
  REPEAT_INTERVAL => 'FREQ=MINUTELY; INTERVAL=10', -- 반복 실행 주기 설정
  COMMENTS => '여기에 주석 남기기!!'

);   


  DBMS_SCHEDULER.SET_ATTRIBUTE('TEST.JB_TEST_JOB','INSTANCE_ID',2);  --수행할 노드지정(RAC환경에서) 

** 인터벌 example

REPEAT_INTERVAL => 'FREQ=HOURLY; interval=1'          <- 1시간 간격 수행 
REPEAT_INTERVAL => 'FREQ=MINUTELY; interval=30'       <- 30분 간격 수행 
REPEAT_INTERVAL => 'FREQ=SECONDLY; interval=5'        <- 5초 간격 수행    
REPEAT_INTERVAL => 'FREQ=WEEKLY; interval=2'          <- 2주 간격 수행

REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=1; BYHOUR=09;BYMINUTE=0;' <- 매일 09시 
REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=1; BYHOUR=09,12,15,18;' <- 매일 특정시간 
REPEAT_INTERVAL => 'FREQ=WEEKLY; INTERVAL=2; BYDAY= MON;' <- 격주차 월요일 
REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=1  INTERVAL=1'   <- 매달 1일 

 

2. 스케쥴

EXEC DBMS_SCHEDULER.DISABLE ('스케줄명') ;   -- 비활성화
EXEC DBMS_SCHEDULER.ENABLE ('스케줄명') ;    -- 활성화
EXEC DBMS_SCHEDULER.RUN_JOB('스케줄명') ;   -- 실행
EXEC DBMS_SCHEDULER.DROP_JOB('스케줄명') ;   -- 삭제

JOB 을 등록했으면 ENABLE 까지 해주어야 JOB 이 스케쥴링대로 돌아간다.


3. 등록현황 조회

SELECT P.OWNER,
       P.JOB_NAME,
       P.STATE,
       P.ENABLED,
       P.COMMENTS,
       CAST(P.NEXT_RUN_DATE AS DATE) NEXT_RUN_DATE,
       P.SCHEDULE_TYPE,
       P.REPEAT_INTERVAL,
       P.JOB_ACTION
FROM   DBA_SCHEDULER_JOBS P
WHERE  P.OWNER = 'AAA'


4. 실행로그 확인

SELECT LOG_ID,LOG_DATE,OWNER,JOB_NAME,JOB_SUBNAME,JOB_CLASS,OPERATION,STATUS
  FROM DBA_SCHEDULER_JOB_LOG WHERE JOB_NAME = '스케줄명 '
 ORDER BY LOG_DATE DESC;
 
5. 실행 상세로그 확인

SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME = '스케줄명'
ORDER BY LOG_DATE DESC;

 

 

반응형
Posted by 돌고래트레이너