ORACLE - DAY 39

BUMSOO·2024년 9월 27일

job scheduling

오라클 환경에서 대부분의 업무에는 작업 스케줄링 기능이 필요하다.

일상적인 데이터베이스 유지 관리 및 응용프로그램에서 스케줄을 잡고 정기적으로 실행할 작업이 필요하다.

DBA는 지정된 시간대에서 정기적인 유지 관리 작업을 예약해서 수행한다.

준비단계

  1. 샘플 테이블 생성
create table hr.log(name varchar2(10), day timestamp);
  1. 정보 수집을 위한 프로시저 생성
create or replace procedure hr.log_proc
is
begin
	insert into hr.log(name, day) values(user, systimestamp);
    commit;
end log_proc;
/
  1. 생성한 프로시저 소스 확인
select text from dba_source where owner='HR' and name='LOG_PROC';
  1. 프로시저 실행 후 결과 확인
execute hr.log_proc

select * from hr.log;

  1. job을 생성, 관리하기 위한 롤(scheduler_admin)이 필요하다.
    grant scheduler_admin to hr;

job 생성

begin
	dbms_scheduler.create_job(
    							job_name=> 'log_job',
                                job_type=> 'stored_procedure',
                                job_action=> 'hr.log_proc',
                                start_date=> systimestamp+1/1440,
                                repeat_interval=> 'freq=minutely;interval=1',
                                end_date=> systimestamp+6/1440,
                                enabled=> true);
end;
/

생성 job 확인

select job_name,start_date,repeat_interval,end_date,enabled
from dba_scheduler_jobs
where job_name='LOG_JOB';

  • JOB은 끝나면 알아서 PURGE 되면서 삭제된다.

job log 정보

  • 수행시간이 완료된 job은 사라져서 조회가 안되지만 수행정보는 purge하기전까지는 계속 남아있다.
select job_name,log_date, status, run_duration
from dba_scheduler_job_run_details
where job_name='LOG_JOB';

enabled=> false

begin
	dbms_scheduler.create_job(
    							job_name=> 'log_job',
                                job_type=> 'stored_procedure',
                                job_action=> 'hr.log_proc',
                                start_date=> to_timestamp('2024-09-27 10:45:00','yyyy-mm-dd hh24:mi:ss'),
                                repeat_interval=> 'freq=minutely;interval=1',
                                end_date=> systimestamp+6/1440,
                                enabled=> false); -- false로 되어있기 때문에 start 시간이 되어도 수행되지는 않는다.
end;
/
  • 설정한 job 확인
select job_name,start_date,repeat_interval,end_date,enabled
from dba_scheduler_jobs
where job_name='LOG_JOB';

  • 시작시간이 되었지만 enabled를 false 하였기 때문에 수행되지는 않는 모습
select JOB_NAME,log_date, status, run_duration
from dba_scheduler_job_run_details
where job_name='LOG_JOB';

수동으로 job의 활성화, 비활성화

  • job 활성화
    execute dbms_scheduler.enable('log_job');
  • job 비활성화
    execute dbms_scheduler.disable('log_job');
begin
	dbms_scheduler.create_job(
    							job_name=> 'log_job',
                                job_type=> 'stored_procedure',
                                job_action=> 'hr.log_proc',
                                enabled=> false); 
end;
/
select job_name,start_date,repeat_interval,end_date,enabled
from dba_scheduler_jobs
where job_name='LOG_JOB';

job 실행(job을 즉시 실행)

execute dbms_scheduler.run_job('log_job');

job 삭제

execute dbms_scheduler.drop_job('log_job',true);
- true 옵션 : job이 enable 되어있는 상태여도 강제로 삭제시킨다

job log 정보 삭제

execute dbms_scheduler.purge_log(job_name=>'log_job');
execute dbms_scheduler.purge_log(log_history=>1, job_name=>'log_job');: 1일 이전의 기록이 삭제된다.

job 정지

execute dbms_scheduler.stop_job(job_name=>'log_job',force=>true);

job 속성 변경

execute dbms_scheduler.SET_ATTRIBUTE(name=>'log_job',ATTRIBUTE=>'start_date',value=>systimestamp+30/1440);

execute dbms_scheduler.SET_ATTRIBUTE(name=>'log_job',ATTRIBUTE=>'end_date',value=>systimestamp+30/1440);

execute dbms_scheduler.SET_ATTRIBUTE(name=>'log_job',attribute=>'repeat_interval',value=>'freq=minutely;interval=2;');

job_type

  • plsql_block : 익명블록이나 SQL문을 실행
  • stored_procedure : PL/SQL, JAVA, C와 같은 내장프로시저를 실행
  • executable : 운영체제 명령행 프로그램을 실행

repeat_interval

freq=hourly;interval=4; : 4시간마다 반복
freq=daily; : 매일 반복
freq=minutely;interval=15; : 15분마다 반복
freq=yearly;bymonth=mar,jun,sep,dec;bymonthday=15; : 매년 3월15일, 6월15일,9월15일,12월15일 반복
freq=yearly;bydate=0315,0615,0915,1215; : 매년 3월15일, 6월15일,9월15일,12월15일 반복

예) 매주 금요일 밤 23시 50분에 수행
repeat_interval=>'freq=weekly;byday=fri;byhour=23;byminute=50;'

  • byweekno : 1~53(주단위)
  • byyearday : 1~366(일단위)
  • bymonthday : 1~31(일단위)
  • bydate : mmdd 형태로 월일 직접지정
  • byday : mon,tue,wed,thu,fri,,sat,sun
  • byhour : 0~23
  • byminute : 0~59
  • bysecond : 0~59

프로그램 & 스케줄

프로그램 생성

begin
	dbms_scheduler.create_program(
    			program_name=>'insert_log_prog',
                program_type=>'plsql_block',
                program_action=>'begin hr.log_proc end;/',
                enabled=>true);
end;
/

생성된 프로그램 정보

select * from dba_scheduler_programs where program_name='INSERT_LOG_PROG';

스케줄 생성

begin
	dbms_scheduler.create_schedule(
    								schedule_name=>'insert_schedule',
                                    start_date=> systimestamp,
                                  repeat_interval=>'freq=minutely;interval=1;',
                                  end_date=> systimestamp+10/1440
                                    );
end;
/

생성된 스케줄 정보

select * from dba_scheduler_schedules where schedule_name='INSERT_SCHEDULE';

생성된 프로그램과 스케줄을 합쳐 job 생성

begin
	dbms_scheduler.create_job(
    						job_name=>'log_job',
                            program_name=>'insert_log_prog',
                            schedule_name=>'insert_schedule',
                            enabled=>true);
end;
/

프로그램 삭제

execute dbms_scheduler.drop_program('insert_log_prog');

스케줄 삭제

execute dbms_scheduler.drop_schedule(schedule_name=>'insert_schedule');

shell을 통한 rman 백업 스케줄

준비단계

  • 현재 사용 SHELL 확인
    echo $SHELL

  • shell 작성
    vi backup.sh

#! /bin/bash -- bash shell을 사용하겠다고 선언
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=ORA19C

rman target / <<EOF
                    
run {
       backup as compressed backupset database;
    }
                    
EOF
  • 권한변경
    chmod 750 backup.sh

  • 작동확인
    sh backup.sh

rman backup을 위한 job 생성

begin
	dbms_scheduler.create_job(
    			job_name=>'rman_backup',
                job_type=>'executable',
                job_action=>'/home/oracle/backup.sh',
                start_date=> systimestamp+1/1440,
                repeat_interval=>'freq=minutely;interval=5;',
                end_date=> systimestamp + 2/1440,
                enabled=>true);
end;
/

job 확인

select job_name,start_date,repeat_interval,end_date,enabled
from dba_scheduler_jobs
where job_name='RMAN_BACKUP';

job log 확인

select job_name,log_date, status, run_duration
from dba_scheduler_job_run_details
where job_name='RMAN_BACKUP';

0개의 댓글