[Oracle] 스케줄러 사용하기

정나영·2021년 7월 28일
1

계기

저번에 프로젝트를 하다가 스케줄러의 필요성을 느껴서 스케줄러에 대해 알아보고 사용해보기로 했다.

오라클 잡과 스케줄러

데이터베이스를 운영하다보면 하루에 한번씩 운영서버의 데이터를 개발서버에 데이터를 넣어주거나 하는 주기적인 작업을 처리할 때가 있습니다. 이렇게 일정한 주기의 작업을 잡(Job)이라고 합니다. 이러한 주기적인 잡을 수행하는 방법은 스케줄러를 활용하는 방법이 있습니다.

[Oracle] 오라클 스케줄러 사용법 & 예제

오라클 스케줄 (DBMS_SCHEDULER)

기존에는 주기적인 작업을 잡 패키지(DBMS_JOB)라는 것을 활용하여 작업을 하였지만 다양한 문제점으로 인해 오라클 10g부터 새로운 스케줄러 패키지인 오라클 스케줄러 (DBMS_SCHEDULER)라는 패키지가 추가되었습니다. 최근에는 이 오라클 스케줄러라는 패키지를 통해서 주기적인 잡(Job)을 처리합니다.

[Oracle] 오라클 스케줄러 사용법 & 예제

스케줄러 사용해보기

보통 직장인들은 모두 1년에 한번씩 연봉협상을 통해 연봉이 변경된다.
항상 연봉이 인상되지는 않겠지만 그렇다고치고 특정 시간에 한번씩 스케줄러를 돌려 직원의 봉급(salary)을 올리는 실습을 해보려고 한다.

오라클 hr 계정에 있는 employees 테이블을 활용할 것이다.

프로시저 만들기

먼저 스케줄러에 사용할 프로시저를 만들어야한다.
기존 salary에 0.5% 인상시키는 프로시저를 다음과 같이 만든다.

CREATE OR REPLACE PROCEDURE INCREASE_SALARY AS 
BEGIN
  UPDATE employees SET salary = salary * 1.5;
END INCREASE_SALARY;

잡 만들기

1분에 한번씩 실행하는 잡을 다음과 같이 만든다.

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
            job_name => '"HR"."JOB_INCREASE_SALARY"',
            job_type => 'STORED_PROCEDURE',
            job_action => 'HR.INCREASE_SALARY',
            number_of_arguments => 0,
            start_date => NULL,
            repeat_interval => 'FREQ=MINUTELY;INTERVAL=1',
            end_date => NULL,
            enabled => FALSE,
            auto_drop => FALSE,
            comments => '봉급인상');
END;

주요 칼럼(?)

  • job_name : 잡 이름
  • job_type : 잡의 타입
    - PLSQL_BLOCK : PL/SQL 블럭
    - STORED_PROCEDURE : 내장프로시저
    - EXECUTABLE : 실행파일
    - ...
  • job_action : 실행할 프로그램
  • repeat_interval : 반복주기
    - 위 쿼리에 적힌 FREQ=MINUTELY;INTERVAL=1 이 코드는 1분에 1번씩 반복하라는 의미를 가진다.
  • enabled : 잡의 활성화 여부

잡 생성할 때 권한 에러가 뜬다면 권한을 해당 계정에 다음과 같이 권한을 부여해줘야한다. (부여할때는 sys계정으로..)

GRANT CREATE ANY JOB TO 계정이름

잡 생성 내역 확인

성공적으로 잡이 생성이 되면 다음과 같은 쿼리로 생성된 내역을 확인해 볼 수 있다.

SELECT * FROM user_scheduler_jobs;

user_scheduler_jobs

잡 활성화

기본적으로 ENABLE 시켜주지않은 잡은 ENABLE = FALSE 상태이다.
비활성화 상태인 JOB을 활성화 시켜주려면 다음과 같이 코드를 실행시켜야한다.

BEGIN
  DBMS_SCHEDULER.enable(name=>'"HR"."JOB_INCREASE_SALARY"');
END;

실행시켜주면 ENABLE = TURE 상태가 되어지며 이는user_scheduler_jobs.enable 칼럼에서 확인할 수 있다.

잡 실행 내역 확인

잡을 활성화 시키면 바로 잡이 실행되며 잡 실행 내역은 다음 쿼리로 확인할 수 있다.
SELECT * FROM user_scheduler_job_log;
user_scheduler_job_log

자세한 내역은 다음과 같은 쿼리로 확인해 볼 수 있다.
SELECT * FROM user_scheduler_job_run_details;

1분에 한번씩 돌아가는거라 로그가 엄청 쌓일 것 같아 두번만 돌리고 잡을 비활성화 시켰다.

비활성화하는 쿼리는 다음 섹션에서 다루겠다.

최종적으로

초기 salary
최종 salary

1번사진에서 2번사진으로 변화된 것을 확인인 할 수 있다.

(36000 1.5) 1.5 = 81000 이 맞으니 내가 생각했던 대로 잘 돌아간 것을 확인할 수 있었다.

잡 비활성화

잡을 비활성화 하는 방법은 다음과 같다.

BEGIN
	DBMS_SCHEDULER.disable(name=>'"HR"."JOB_INCREASE_SALARY"', force => TRUE);
END;

잡 삭제

이제 잡을 삭제해보자.
삭제 쿼리는 다음과 같다.

BEGIN
    DBMS_SCHEDULER.DROP_JOB(job_name => '"HR"."JOB_INCREASE_SALARY"',
                                defer => false,
                                force => false);
END;

글을 마치며

스케줄러 한번 맛보기로 사용해봤는데 실무에서는 어떻게 사용하는지 궁금하고 보고 또 공부해서 이런식으로 활용해보고싶다.

profile
I can do it!

0개의 댓글