본문 바로가기
프로그래밍/데이터베이스

ORACLE 작업(JOB)의 실행 일정관리 - DBMS_JOB

by pentode 2018. 4. 4.

ORACLE에서 주기적으로 작업을 실행하고 작업 큐 내의 작업들을 관리하는데, DBMS_JOB 패키지가 사용됩니다. Oracle 10g 부터는 좀더 확장된 기능을 가진 DBMS_SCHEDULER 패키지가 제공됩니다. DBMS_JOB 패키지도 그대로 제공됩니다. 이번에는 DBMS_JOB 패키지에 대해서 알아봅니다.


DBMS_JOB 패키지를 사용하는데 특별한 시스템 권한이 요구되지 않습니다. 작업(Job)은 작업의 소유자가 아닌 다른 사용자가 수정 또는 삭제 할 수 없습니다. Job 으로 실행할 프로시저(Procedure)자신이 소유자가 아니더라도 실행(Execute)권한이 있으면 작업으로 실행시킬 수 있습니다.

 

주의해야할 점은 작업이 시작되어서 실행되는 중에 작업을 중지시킬 수 있는 방법은 없다는 것입니다.


Oracle RAC(Real Application Clusters)가 사용중인 환경에서 DBMS_JOB은 작업들이 여러 인스턴스에서 실행되는 것을 지원합니다. 기본적으로는 작업들은 어떤 인스턴스에서도 실행될 수 있습니다. 그러나 단 하나의 단일 인스턴스가 작업을 실행할 것입니다.

 


1. 작업을 등록합니다.

 

DBMS_JOB.SUBMIT (
    job       OUT    BINARY_INTEGER,
    what      IN     VARCHAR2,
    next_date IN     DATE DEFAULT SYSDATE, 
    interval  IN     VARCHAR2 DEFAULT 'NULL',
    no_parse  IN     BOOLEAN DEFAULT FALSE,
    instance  IN     BINARY_INTEGER DEFAULT ANY_INSTANCE,
    force     IN     BOOLEAN DEFAULT FALSE
);

 

- job : 작업 큐에 등록되어진 작업 번호 입니다.(출력 파라미터)
- what : 실행할 PL/SQL 프로시저 입니다. what 파라미터는 세미콜론(;)으로 끝나야 합니다.
- next_date : 작업이 실행될 다음 시간 입니다. 기본값은 SYSDATE 입니다.
- interval : 다음에 작업이 실행될 시간을 계산하는 날짜 함수 입니다. 기본값은 NULL 입니다. interval은  다음 시간값이나 NULL이어야 합니다. 이 값은 VARCHAR2 타입이고 작은 따옴표로  둘러싸여져야 합니다.
- no_parse : 만약 NO_PARSE가 FALSE로 설정(이것이 기본값입니다.)되면, 오라클은 job과 연관된 프로시저를 파싱합니다. 만약 NO_PARSE가 TRUE로 설정되면, 오라클은 job과 연관된 프로시저를 job이 처음 실행될 때 파싱합니다. 예를 들어, 만약 job과 관련된 테이블이 생성되기 전에 job 을 submit 하기를 원한다면 NO_PARSE를 TRUE 로 설정하면 됩니다.
- instance : 작업이 제출되어 졌을때, 어떤 instance 가 작업을 실행할지 지정합니다.(여기서 instance는 클러스터링된 컴퓨터들 중의 하나 입니다.)
- force : TRUE인 경우 모든 양의 정수는 작업 인스턴스로 허용됩니다. 이 값이 FALSE이면(FASE가 기본값 입니다.) 지정된 인스턴스가 실행되고 있어야 합니다. 그렇지 않으면 예외가 발생합니다.

 

VARIABLE jobno number;
BEGIN
   DBMS_JOB.SUBMIT(
      :jobno, 
      'process_job();',
      SYSDATE,
      'SYSDATE + 1');
   COMMIT;
END;
/
Statement processed.
print jobno
JOBNO
----------
14144

 

 

2. JOB 조회

 

SELECT JOB, WHAT, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN FROM USER_JOBS;

 


3. BROKEN 프로시저 : 작업을 비활성화 하거나 다시 활성화 합니다.

 

BEGIN
    DBMS_JOB.BROKEN(1, FALSE); -- 비활성화
    COMMIT;
END;
/

 

 

 

4. CHANGE 프로시저 : 작업 파라미터를 수정합니다.

 


DBMS_JOB.CHANGE ( 
   job       IN  BINARY_INTEGER,
   what      IN  VARCHAR2,
   next_date IN  DATE,
   interval  IN  VARCHAR2,
   instance  IN  BINARY_INTEGER DEFAULT NULL,
   force     IN  BOOLEAN DEFAULT FALSE ); 

BEGIN
   DBMS_JOB.CHANGE(14144, null, null, 'sysdate+3');
   COMMIT;
END;

 

 

5. INSTANCE 프로시저 : 실행될 인스턴스를 할당합니다.

 

DBMS_JOB.INSTANCE (
    job        IN BINARY_INTEGER,
    instance   IN BINARY_INTEGER,
    force      IN BOOLEAN DEFAULT FALSE
);

 

 

6. INTERVAL 프로시저 : 작업이 실행될 간격을 수정합니다.

 

DBMS_JOB.INTERVAL (
    job       IN  BINARY_INTEGER,
    interval  IN  VARCHAR2
);

 

 

7. NEXT_DATE 프로시저 : 다음 실행 시간을 수정합니다.

 

 

DBMS_JOB.NEXT_DATE (job IN  BINARY_INTEGER, next_date IN DATE);

 

 

8. REMOVE 프로시저 : 작업 큐에서 작업을 제거합니다.

 

BEGIN
    DBMS_JOB.REMOVE(2);
    COMMIT;
END;
/

 

9. RUN 프로시저 : 작업을 강제 실행 합니다.

 

BEGIN
   DBMS_JOB.RUN(2);
   COMMIT;
END;
/

 

 

10. USER_EXPORT 프로시저 : 지정된 작업을 내보내거나 지정된 작업과 인스턴스 선호도로 내보냅니다.

 

declare
    vstring varchar2(4000);
begin
    dbms_job.user_export (job => 7748, mycall => vstring);
    dbms_output.put_line (vstring);
end;

 


11. WHAT 프로시저 : 작업이 실행할 프로시저를 변경합니다.

 

execute dbms_job.what(100,'my_package.proc1;');
반응형