[Oracle] 오라클 스케줄 기능을 이용한 오라클 작업 자동화

·2025년 9월 16일
0

오라클 관리

목록 보기
148/163

💡 오라클 스케줄이란?

os의 crontab과 같은 기능을 오라클에서 구현한 것
--> 특정 시간에 특정 작업이 자동으로 수행되도록 설정하는 기능


💡 오라클 스케줄 종류 2가지

  1. time base 스케줄러: 특정 시간에 특정 작업이 수행되게 자동화
  2. event base 스케줄러: 특정 이벤트가 발생하면 특정 작업이 수행되게

💡 DBA 작업이 스케줄러 사용에 유용한 경우

  1. 매일밤 또는 매월 말일에 월말 작업(통계정보 수집)을 자동화
  2. database 백업을 자동화
  3. 테이블 통계정보 수집
  4. invalid 된 인덱스나 프로시져를 다시 valid 시키는 작업을 자동화

💡 리눅스의 crontab에 비해 오라클 스케줄러가 더 좋은 이유

  1. 작업 수행과정이 잘 진행되고 있는지 모니터링을 할 수 있다.
  2. 작업 수행 이력을 확인할 수 있다.
  3. 스케줄을 설정하는게 훨씬 더 자세히 설정할 수 있다.
    ex) 월, 수, 금요일 밤 10시에 특정작업이 수행되게하라

[실습1] 스케줄러 작업 실습

■ 실습 순서
 
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';

[실습2] 만들었던 job과 스케줄을 drop하기

문제. 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');

문제1. 다음의 명령어가 매일 아침 8시에 수행되게하시오

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';

[문제2] 매일 밤 10시에 아래의 명령어가 수행되도록 스케줄과 프로그램과 job을 생성하시오

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';

0개의 댓글