DBMS_JOB
- 오라클에서 주기적으로 수행되는 백업이나 쿼리 및 프로시저 등의 job을 시간,일,월 단위 등으로 주기적으로 예약 작업으로 등록하여 동작할 수 있도록 하는 스케줄러
DBMS_JOB 구성요소
- SUBMIT : 데이터베이스에 새로운 JOB을 추가하는 프로시저
- REMOVE : 데이터베이스에 추가된 JOB을 삭제하는 프로시저
- CHANGE : 데이터베이스에 저장되어 있는 JOB의 필드를 변경하는 프로시저
- WHAT : JOB이 수행하는 작업을 변경하는 프로시저
- NEXT_DATE : JOB이 스케줄이되어 Timer에 의해 자동으로 실행될 때를 변경하는 프로시저
- INTERVAL : 실행 주기 파라미터를 변경하는 프로시저
- BROKEN : 데이터베이스에 저장되어 있는 JOB 상태를 활성화 또는 비활성화 상태로 설정하는 프로시저
- RUN : JOB을 현재 시점에서 즉시 수행시키는 프로시저
SUBMIT
<오라클 기본 셋팅 확인>
: 'JOB_QUEUE_PROCESSES'의 값이 0일 경우 스케줄러가 작동하지 않는다
select num,name,value
from v$parameter
where name like '%job%';
NUM NAME VALUE
---------- --------------------------------------------------------------------- --------
773 max_datapump_jobs_per_pdb 100
3106 job_queue_processes 4000
사용하는 서버의 경우 4000으로 설정되어 있지만 0일 경우 아래와 같이 변경한다. 다이나믹한 뷰로 재기동하지 않아도 DDL을 통해 파라미터 값을 변경할 수 있다.
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 10;
< DBMS_JOB 패키지 내 프로시저 이용>
variable job_id number; /*job_id라는 변수값을 number type으로 선언*/
/*HR 스키마 통계정보 수집을 sysdate기준으로 시작하며 1분마다 수행하는 job 생성*/
BEGIN
DBMS_JOB.SUBMIT
(
job => :job_id,
what => 'BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(''HR'',stattab=>''BACKUP2'',statid=>''DAILY_'||to_char(SYSDATE,'YYYYMMDD')||''',cascade=>TRUE,method_opt=>''FOR ALL COLUMNS SIZE 1'',estimate_percent => 10); END;',
next_date => SYSDATE,
interval => 'sysdate+1/24/60'
);
COMMIT;
END;
/
1. job - 실행할 job의 number
2. what - 실행할 PL/SQL 프로시저 명 또는 sequence값 , 수행할 내역
3. next_date - .job을 언제 처음 시작할 것인가를 지정
4. interval - 처음 job을 실행한 후, 얼마 주기로 실행할 것인지 지정
※ JOB_INTERVAL 설정
SYSDATE+7 : 7일에 한번 씩 job 수행
SYSDATE+1/24 : 1시간에 한번 씩 job 수행
SYSDATE+30/ : 30초에 한번 씩 job 수행(24: 시간 당, 1440(24x60):분 당, 86400(24x60x60):초 당 )
TRUNC(SYSDATE, 'MI')+8/24 : 최초 job 수행시간이 12:29분 일 경우 매시 12:29분에 job 수행
TRUNC(SYSDATE+1) : 매일 밤 12시에 job 수행
TRUNC(SYSDATE+1)+3/24 : 매일 오전 3시 job 수행
NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+15/25 : 매주 월요일 오후 3시 정각에 job 수행
TRUNC(LAST_DAY(SYSDATE))+1 : 매월 1일 밤 12시에 job 수행
TRUNC(LAST_DAY(SYSDATE))+1+8/24+30/1440 : 매월 1일 오전 8시 30분
REMOVE
데이터베이스에 추가한 JOB을 삭제하는 프로시저
DBMS_JOB.REMOVE(job);
*job에는 job생성했을 당시 부여된 넘버로 dba_jobs에서 확인가능
CHANGE
데이터베이스에 저장되어 있는 JOB의 필드를 변경하는 프로시저
DBMS_JOB.CHANGE(job, what, next_date, interval);
WHAT
JOB이 수행하는 작업을 변경하는 프로시저
DBMS_JOB.WHAT(job,what);
*job - 변경할 job number
*what - 변경할 프로시저 및 시퀀스 내용
NEXT_DATE
job이 schedule되어 Tibero에 의해 자동으로 실행될 때를 변경하는 프로시저
DBMS_JOB.NEXT_DATE(job, next_date);
* job : 실행할 job number
* next_date : job이 schedule되어 실행될 시간
INTERVAL
job 실행주기 파라미터를 변경하는 프로시저
DBMS_JOB.INTERVAL(job, interval);
* job : 실행할 job number
* interval : job을 수행 후 next_date를 update하기 위한 expression. date type으로 evaluate되는 문자열
BROKEN
데이터베이스에 저장되어 있는 JOB의 상태를 활성화 또는 비활성화 상태로 설정하는 프로시저
DBMS_JOB.BROKEN(job, broken);
*job - 실행할 job number
*broken
- 활성화 False
- 비활성화 True
RUN
생성한 job을 현재 세션에서 즉시 수행시키는 프로시저로
broken 되어 있어도 실행시키며, 실향에 성공한 경우 job을 정상 상태로 변경한다.
DBMS_JOB.RUN(job);
*job - job number