os의 crontab과 같은 기능을 오라클에서 구현한 것
--> 특정 시간에 특정 작업이 자동으로 수행되도록 설정하는 기능
- time base 스케줄러: 특정 시간에 특정 작업이 수행되게 자동화
- event base 스케줄러: 특정 이벤트가 발생하면 특정 작업이 수행되게
- 매일밤 또는 매월 말일에 월말 작업(통계정보 수집)을 자동화
- database 백업을 자동화
- 테이블 통계정보 수집
- invalid 된 인덱스나 프로시져를 다시 valid 시키는 작업을 자동화
- 작업 수행과정이 잘 진행되고 있는지 모니터링을 할 수 있다.
- 작업 수행 이력을 확인할 수 있다.
- 스케줄을 설정하는게 훨씬 더 자세히 설정할 수 있다.
ex) 월, 수, 금요일 밤 10시에 특정작업이 수행되게하라
■ 실습 순서
1. 프로그램 생성 ( dbms_scheduler.create_program)
2. 스케줄 생성 ( dbms_scheduler.create_scheduler)
3. 작업 생성 ( dbms_scehduler.create_job)
4. 작업이 잘 수행되는지 모니터링 ( select * from dba_scheduler_job_run_details )
■ 스케줄러 작업 실습
0. scott 유져에서 emp01 테이블을 생성합니다
SCOTT> create table emp01
( hiredate date );
1. scott 으로 접속해서 스케줄을 생성한다.
SCOTT> begin
dbms_scheduler.create_schedule(
schedule_name=>'scott_insert_sch',
repeat_interval=>'freq=secondly; interval=5');
end;
/
5초마다 한번씩 작동되는 스케줄
2. 프로그램 생성
SCOTT> begin
dbms_scheduler.create_program(
program_name=>'scott_insert_prog',
program_type=>'PLSQL_BLOCK',
program_action=>'begin insert into emp01(hiredate) values (sysdate); end;');
end;
/
emp01 테이블에 오늘 날짜를 입력하는 프로그램 생성
-- 3) 작업(job) 생성
SCOTT> begin
dbms_scheduler.create_job(
job_name=>'scott_insert',
program_name=>'scott_insert_prog',
schedule_name=>'scott_insert_sch' );
end;
/
4. 작업, 프로그램 enable
SCOTT> exec dbms_scheduler.enable('scott_insert');
SCOTT> exec dbms_scheduler.enable('scott_insert_prog');
5. 결과 확인
SCOTT> select * from emp01;
6. 스케줄이 잘 도는지 확인하시오 !
select * from dba_scheduler_job_run_details
WHERE owner='SCOTT';
문제. scott_insert job 을 중지 시킵니다.
SCOTT> exec dbms_scheduler.disable('scott_insert');
문제. scott_insert job 을 drop 시키시오
SCOTT> exec dbms_scheduler.drop_job('scott_insert');
문제. scott_insert_sch 스케즐을 drop 하시오
SCOTT> exec dbms_scheduler.drop_schedule('scott_insert_sch');
문제. scott_insert_prog 프로그램을 drop 시키시오
SCOTT> exec dbms_scheduler.drop_program('scott_insert_prog');
alter system set resource_manager_plan='daytime';
1. 스케줄 생성
SCOTT> begin
dbms_scheduler.create_schedule(
schedule_name=>'scott_daily_8am_sch',
repeat_interval=>'freq=daily; byhour=8; byminute=0; bysecond=0');
end;
/
설명: freq 에 daily 를 쓰면 매일 반복해서 수행되는 스케즐이라는 것입니다.
2. 프로그램 생성
SCOTT> begin
dbms_scheduler.create_program(
program_name=>'alter_system_plan_prog',
program_type=>'PLSQL_BLOCK',
program_action=>'begin execute immediate ''alter system set resource_manager_plan=''daytime''''; end;');
end;
/
3. 작업 생성
SCOTT> begin
dbms_scheduler.create_job(
job_name=> 'alter_system_resouce_job',
program_name=>'alter_system_plan_prog',
schedule_name=>'scott_daily_8am_sch' );
end;
/
4. 작업 활성화 & 프로그램 활성화
SCOTT> exec dbms_scheduler.enable('alter_system_resouce_job');
SCOTT> exec dbms_scheduler.enable('alter_system_plan_prog');
5. 스케줄이 잘 도는지 확인
select owner, job_name, enabled, state, schedule_name, program_name
from dba_scheduler_jobs
where owner = 'SCOTT';
alter system set resource_manager_plan='nighttime';
begin
dbms_scheduler.create_schedule(
schedule_name=>'scott_daily_10pm_sch',
repeat_interval=>'freq=daily; byhour=22; byminute=0; bysecond=0');
end;
/
begin
dbms_scheduler.create_program(
program_name=>'alter_system_plan_prog_night',
program_type=>'PLSQL_BLOCK',
program_action=>'begin execute immediate ''alter system set resource_manager_plan=''nighttime''''; end;');
end;
/
begin
dbms_scheduler.create_job(
job_name=> 'alter_system_resouce_job_night',
program_name=>'alter_system_plan_prog_night',
schedule_name=>'scott_daily_10pm_sch' );
end;
/
exec dbms_scheduler.enable('alter_system_resouce_job_night');
exec dbms_scheduler.enable('alter_system_plan_prog_night');
-- 스케줄이 잘 도는지 확인
select owner, job_name, enabled, state, schedule_name, program_name
from dba_scheduler_jobs
where owner = 'SCOTT';