DBAtlas · 데이터베이스 운영 아틀라스

스케줄러 job 생성, 수동 실행, 비활성화, 삭제

Oracle스케줄러

명령어

-- 1) Create disabled, set attributes, then enable:
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(
    job_name        => 'CUSTOMER_APP.NIGHTLY_STATS',
    job_type        => 'PLSQL_BLOCK',
    job_action      => q'[BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'CUSTOMER_APP', options => 'GATHER STALE'); END;]',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
    enabled         => FALSE,
    auto_drop       => FALSE,
    comments        => 'Nightly stale statistics gathering');
  DBMS_SCHEDULER.SET_ATTRIBUTE('CUSTOMER_APP.NIGHTLY_STATS', 'max_run_duration', INTERVAL '2' HOUR);
  DBMS_SCHEDULER.SET_ATTRIBUTE('CUSTOMER_APP.NIGHTLY_STATS', 'logging_level', DBMS_SCHEDULER.LOGGING_FULL);
  DBMS_SCHEDULER.ENABLE('CUSTOMER_APP.NIGHTLY_STATS');
END;
/

-- 2) Validate the calendar expression (next run time):
SET SERVEROUTPUT ON
DECLARE
  l_next TIMESTAMP WITH TIME ZONE;
BEGIN
  DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING(
    calendar_string   => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
    start_date        => SYSTIMESTAMP,
    return_date_after => SYSTIMESTAMP,
    next_run_date     => l_next);
  DBMS_OUTPUT.PUT_LINE('Next run: ' || l_next);
END;
/

-- 3) Run now in the background (does not affect the schedule):
EXEC DBMS_SCHEDULER.RUN_JOB('CUSTOMER_APP.NIGHTLY_STATS', use_current_session => FALSE);

-- 4) Status:
SELECT owner, job_name, enabled, state, run_count, failure_count,
       last_start_date, next_run_date
FROM   dba_scheduler_jobs WHERE owner = 'CUSTOMER_APP';

-- 5) Stop (if running) / disable / drop:
-- EXEC DBMS_SCHEDULER.STOP_JOB('CUSTOMER_APP.NIGHTLY_STATS', force => FALSE);
EXEC DBMS_SCHEDULER.DISABLE('CUSTOMER_APP.NIGHTLY_STATS', force => TRUE);
EXEC DBMS_SCHEDULER.DROP_JOB('CUSTOMER_APP.NIGHTLY_STATS', force => TRUE);

하는 일

DBMS_SCHEDULER로 예약 PL/SQL job을 정의한다. max_run_duration(초과 시 이벤트 발생)과 상세 로깅 수준을 설정하고, 캘린더 표현식을 미리 검증하며, 일정을 방해하지 않고 수동 실행할 수 있다.

사용 시점

유지보수, ETL, 정리 같은 반복 데이터베이스 작업을 cron 대신 데이터베이스 내부에서 RAC/Data Guard를 인식하며 실행하기 위해.

주의

추가 라이선스가 없다. start_date의 시간대가 중요하다. SYSTIMESTAMP는 데이터베이스 서버의 TZ를 사용하므로 DST 변경 시 어긋나지 않도록 명시적 지역(예: 'Europe/Istanbul')을 사용한다. JOB_QUEUE_PROCESSES=0이면 어떤 job도 실행되지 않는다. force=>TRUE로 DISABLE해도 실행 중인 인스턴스는 멈추지 않고 이후 실행만 막는다. 중단하려면 STOP_JOB을 사용한다. 다른 스키마에 job을 만들려면 CREATE ANY JOB이 필요하다.

DBAtlas에서 열기 →

관련 항목