오라클 환경에서 대부분의 업무에는 작업 스케줄링 기능이 필요하다.
일상적인 데이터베이스 유지 관리 및 응용프로그램에서 스케줄을 잡고 정기적으로 실행할 작업이 필요하다.
DBA는 지정된 시간대에서 정기적인 유지 관리 작업을 예약해서 수행한다.
create table hr.log(name varchar2(10), day timestamp);
create or replace procedure hr.log_proc
is
begin
insert into hr.log(name, day) values(user, systimestamp);
commit;
end log_proc;
/
select text from dba_source where owner='HR' and name='LOG_PROC';
execute hr.log_proc
select * from hr.log;

grant scheduler_admin to hr;
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;
/
select job_name,start_date,repeat_interval,end_date,enabled
from dba_scheduler_jobs
where job_name='LOG_JOB';


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

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;
/
select job_name,start_date,repeat_interval,end_date,enabled
from dba_scheduler_jobs
where job_name='LOG_JOB';

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

execute dbms_scheduler.enable('log_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';

execute dbms_scheduler.run_job('log_job');

execute dbms_scheduler.drop_job('log_job',true);
- true 옵션 : job이 enable 되어있는 상태여도 강제로 삭제시킨다
execute dbms_scheduler.purge_log(job_name=>'log_job');
execute dbms_scheduler.purge_log(log_history=>1, job_name=>'log_job');: 1일 이전의 기록이 삭제된다.
execute dbms_scheduler.stop_job(job_name=>'log_job',force=>true);
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;');
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;'
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';
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 확인
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
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;
/
select job_name,start_date,repeat_interval,end_date,enabled
from dba_scheduler_jobs
where job_name='RMAN_BACKUP';
select job_name,log_date, status, run_duration
from dba_scheduler_job_run_details
where job_name='RMAN_BACKUP';