Enabling Process Used for Excuting Jobs
잡 큐(Job Queue)를 이용하여 주기적으로 스케쥴 루틴(Jobs)을 수행할 수 있습니다. DBMS_JOB 패키지를 이용하여 작업의 스케쥴을 잡 큐에 넣을 수 있으며, 어떤 작업을 수행하게 할 지 결정할 수 있습니다. 또한 이미 적용한 작업을 변경, 보류, 혹은 삭제를 수행할 수 있습니다.
잡 큐(Jnnn) 프로세서는 잡 큐에 있는 작업을 수행합니다. 각각의 인스턴스에서 이러한 잡 큐는 CJQ0(Coordinator Job Queue) 백그라운드 프로세스에 의해 동적으로 수행됩니다. 선택되어 수행되어질 작업들은 DBA_JOBS 뷰를 통해 확인할 수 있습니다. 시간순으로 정렬되어 있으며 선택된 작업은 Jnnn 프로세스가 선택된 작업을 수행합니다. 각각의 Jnnn 프로세스는 선택된 작업을 수행합니다.(Jnnn 프로세스는 CJQ 프로세스가 가지고 있는 하위 프로세스 입니다.)
JOB_QUEUE_PROCESSES 초기화 파라메터로 인스턴스가 CJQ 프로세스를 시작할지 안할지를 결정할 수 있습니다. 파라메터가 0으로 선언되어 있으면 데이타베이스가 시작될때 CJQ 프로세스를 시작하지 않으며 잡 큐에 있는 작업들을 수행하지 않습니다. JOB_QUEUE_PROCESSES 파라메터는 또한 인스턴스에서 수행될 수 있는 최대 Jnnn 프로세스의 갯수를 정의하기도 합니다. 최대값은 1000 입니다.
다음과 같이 파라메터를 설정하면 CJQ 프로세스는 데이터베이스가 시작할때 같이 시작됩니다. 그리고 최대 60개의 Jnnn 프로세스를 가지게 됩니다.
JOB_QUEUE_PROCESS = 60
새로운 값이 기존의 값보다 작거나 현재 수행중인 Jnnn 의 갯수보다 작으면 수행중인 프로세스는 수행중인 작업이 종료되는 순간 정지하게 됩니다.
Jnnn 프로세스는 데이터베이스가 Restricted 상태라면 Jnnn 프로세스는 수행되지 않습니다.
Managing Job Queues
The DBMS_JOB Package
잡 큐(Job Queue)에 있는 작업을 등록하고 관리하려면 DBMS_JOB 패키지에 있는 프로시저를 수행하면 됩니다. 작업큐를 사용하기 위해 필요한 데이터베이스 권한은 따로 존재하지 않습니다. 잡 큐를 사용할 수 있는 모든 사용자는 잡 큐 프로시저를 실행할 수 있습니다.
다음은 DBMS_JOB 패키지에 있는 프로시저들 입니다.
- SUBMIT :
잡 큐에 작업을 등록합니다. - REMOVE :
잡 큐에 등록되어 있는 작업을 삭제합니다. - CHANGE :
잡 큐에 등록되어 있는 작업을 변경합니다. 작업의 주석을 변경하거나, 수행 시간, 수행 간격등을 조정할 수 있습니다. - WHAT :
특정 작업의 주석을 변경합니다. - NEXT_DATE :
특정 작업의 다음 수행 날짜를 지정합니다. - INTERVAL :
특정 작업의 수행 주기를 변경합니다. - BROKEN :
작업이 실패했음을 나타내는 플레그를 설정하거나 해제합니다. 실패로 설정되어 있다면 해당 작업을 수행하지 않습니다. - RUN :
특정 작업을 강제로 수행합니다.
Submitting a Job to the Job Queue
새로운 작업을 잡 큐에 넣기 위해 DBMS_JOB 패키지의 SUBMIT 프로시저를 이용합니다. SUBMIT 프로시저에서 다음 파라메터들을 사용할 수 있습니다.
- JOB :
출력 파라메터. 새로 생성한 작업의 식별 이름입니다. 작업을 변경하거나 삭제할때 반드시 이 번호를 사용해야 합니다. - WHAT :
수행하고자 하는 PL/SQL 코드 입니다. - NEXT_DATE
작업이 수행될 날짜를 정합니다. 기본값은 SYSDATE 입니다. - INTERVAL :
다음번 수행될 날짜를 지정합니다. 기본값은 NULL 입니다. 반드시 시간 혹은 NULL 값만을 취합니다. - NO_PARSE
플래그(FLAG)입니다. FALSE(기본값)로 설정시 해당 적업과 관련된 프로시저를 해석(PARSE)합니다. TRUE 일 경우 처음 실행될때 해석을 합니다. 예를들어 테이블을 만들기전에 작업을 SUBMIT 하기 위해선 NO_PARSE 값을 TRUE 로 놓습니다.
예로, 다음 작업을 큐에 넣는다고 가정하고 작업 번호(jobnumber)를 출력해 보겠습니다. 작업은 DBMS_DDL.ANALYZE_OBJECT 를 호출하여 hr.employees 테이블의 통계정보를 생성합니다. 통계정보는 해당 테이블이 가지고 있는 행의 반개를 기준으로 작성됩니다. 이 작업은 매 24시간마다 수행됩니다.
VARIABLE jobno NUMBER
BEGIN
DMBS_JOB.SUBMIT(:jobno,
'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',
''HR'',''EMPLOYEES'',
''ESTIMATE'',NULL, 50);',
SYSDATE,'SYSDATE+1');
COMMIT;
END;
/
PRINT jobno
JOBNO
----------
14144
Job Environment
작업을 잡 큐에 넣거나 혹은 변경하였을때 오라클은 다음과 같은 환경 특징을 기록합니다.
- 현재 사용자
- 작업을 넣거나 변경한 사용자
- 현 스키마(ALTER SESSION SET CURRENT_SCHEMA 구문을 입력했었다면 현재 사용자와 큐에 넣은 사용자가 다를 수 있습니다.)
또한 다음과 같은 NLS 파라메터도 함께 기록됩니다.
- NLS_LANGUAGE
- NLS_TERRITORY
- NLS_CURRENCY
- NLS_ISO_CURRENCY
- NLS_NUMERIC_CHARATER
- NLS_DATE_FORMAT
- NLS_DATE_LANGUAGE
- NLS_SORT
오라클은 매번 작업이 수행될때 마다 이러한 환경 변수들을 복원합니다. NLS_LANGUAGE 와 NLS_TERRITORY 파라메터는 정의되지 않은 NLS 파라메터에 기본값을 제공해 줍니다.
DBMS_SQL 패키지나 ALTER SESSION 구문을 이용하여 이러한 작업의 환경변수값을 변경할 수 있습니다.
Jobs and Import/Export
작업을 익스포트 하거나 임포트 할 수 있습니다.. 따라서 해당 작업을 한 데이터베이스에서 익스포트 하여 다른 데이터베이스에 전송이 가능합니다. 익스포팅이나 임포팅 작업을 수행시, 작업 번호, 환경변수, 정의는 그대로 유지됩니다.
Job Owner
작업을 잡 큐에 넣을때, 오라클은 작업을 집어넣는 사람을 작업의 소유자로 간주합니다. 작업의 소유자만이 작업을 변경하거나 강제로 수행시키고 큐에서 삭제할 수 있습니다.
Job Number
큐에 들어간 작업은 작업 번호로써 구분이 됩니다. 작업을 큐에 넣을때 JOBSEQ라는 SYS소유의 시퀀스로부터 작업 번호를 자동으로 부여 받습니다. 한번 작업 번호를 할당받으면 작업번호는 변경할 수 없습니다. 작업이 익스포트 혹은 임포트 되어진다 해도 작업 번호는 불변입니다.
Job Definition
작업 정의는 SUBMIT 프로시저의 WHAT 파라메터 에 정의되어 있는 PL/SQL 코드 입니다. 보통, 작업 정의는 단일 프로시저 호출로 정의됩니다. 프로시저는 여러개의 파라메터를 호출 할 수 있습니다.
다음 예시는 올바른 작업 정의 입니다.
- 'myproc(''10-JAN-99'', next_date, broken);'
- 'scott.emppackage.give_raise(''JFEE'',3000.00);'
- 'dbms_job.remove(job);'
Job Execution Interval
작업이 일정한 간격으로 주기적으로 실행되어야 한다면 INTERVAL 파라메터에 'SYSDATE + 7'과 같은 날짜 표현식을 사용하시면 됩니다. 다음 예시를 참고하세요.
- 'SYSDATE + 7' :
마지막 수행 후 정확히 7일 후 - 'SYSDATE + 1/48' :
매 30분 마다 - 'NEXT_DAY(TRUNC(SYSDATE),''MONDAY'') + 15/24'
매 월요일 오후 3시마다 - 'NEXT_DAY(ADD_MONTH(TRUNC(SYSDATE),''Q''),3),''THURSDAY'')'
매 분기의 첫번째 목요일
항상 특정 시간에 작업을 수행하게 만들고 싶으면 INTERVAL 과 NEXT_DATE 파라메터를 'NEXT_DAY(TRUNC(SYSDATE),''MONDAY'');' 와 비슷한 방식으로 선언해 주시면 됩니다.
Database Links and Jobs
데이터베이스 링크를 사용하는 작업을 큐에 넣으면 해당 링크는 반드시 사용자 이름과 암호를 포함시켜야 합니다. 익명의 데이터베이스 링크는 작업을 성공적으로 수행할 수 없습니다.
How Job Execution
Jnnn 프로세스가 작업을 수행합니다. 작업을 수행하기 위해 프로세스는 세션을 생성합니다. Jnnn프로세스가 작업을 수행할때 작업의 소유자와 같은 권한을 가진 환경에서 수행됩니다. 작업에 기술되어 있는 오브젝트들에 접근하기 위한 권한이 모두 있는지 반드시 확인하십시요.
DBMS.JOB.RUN 프로시저를 이용해 강제로 작업을 수행할때 작업은 사용자 프로세스(User process)와 기본 권한을 가진 상태로만 수행합니다. 롤을 통해 위임받은 권한들은 사용할 수 없습니다. 작업이 수행되는 중 참조하게 되는 오브젝트들에 대한 접근 권한이 있는지 확인하십시요.
Job Queue Locks
한번에 한 세션에서만 작업이 수행될 수 있도록 오라클은 수행중인 작업에 대해 잡 큐를 잠급니다. 작업이 수행될때 해당 세션은 해당 작업에 대해 잠금(Lock)을 겁니다. 세션이 현재 잡고 있는 잠금에 대한 정보는 데이터 딕셔너리를 통해 확인해 볼 수 있습니다.
다음 쿼리를 참고하세요.
SELECT SID, TYPE, ID1, ID2 FROM V$LOCK WHERE TYPE = 'JQ';
SID TY ID1 ID2
12 JQ 0 14114
1 row selected.
위 쿼리에서 잠금(Lock)을 잡고 있는 세션은 12 입니다. ID1 열은 JQ 블럭에 대해 항상 0 입니다. ID2 열은 세션이 수행중인 작업의 작업 번호 입니다. 위 뷰는 DBA_JOBS_RUNNING 뷰와 결합(JOIN) 하여 좀더 상세한 정보를 획득할 수 있습니다.
Job Execution Errors
작업이 실패했을시, 추적파일(trace file)과 alert log 파일에 해당 정보가 기록됩니다. ORA-12012 메세지를 작성하고 실패한 작업의 작업 번호를 기록합니다.
다음의 경우 잡 큐에 있는 작업이 실패합니다.
- 네트워크나 인스턴스의 실패
- 작업 수행중 발생한 예외
작업을 수행하기 위해 시도하는 중 에러가 반환되면 오라클은 다시한번 그 작업을 수행하려 합니다. 첫번째 재시도는 실패후 1분후, 두번째 시도는 2분후, 세번째 시도는 4분후... 이런 방식으로 전 시도의 대기 시간보다 2배의 시간 간격을 두고 재시도 합니다. 작업이 16번 실패하면 오라클은 자동으로 작업에 BROKEN 플레그를 선언하고 더이상 그 작업을 수행하지 않습니다. 하지만 재시도 중간 중간 작업이 제대로 돌아갈 수 있게 문제를 해결할 수 있는 기회들이 있습니다. 이 기회들은 오라클이 작업을 재수행 하는데 방해를 주지 않습니다.
Removing a Job from the Job Queue
잡 큐에서 작업을 삭제하기 위해 REMOVE 파라메터를 사용할 수 있습니다.
다음 구문은 잡 큐에서 14114의 작업번호를 가진 작업을 잡큐에서 삭제하는 방법입니다.
BEGIN
DBMS_JOB.REMOVE(14114);
END;
/
제한사항
- 현재 수행중인 작업을 잡 큐에서 제거할 수 있습니다만, 수행중인 작업은 중단되지 않고 끝까지 수행됩니다.
- 자기 자신의 작업만 삭제할 수 있습니다. 자신의 소유 작업이 아닌 작업을 삭제하려 할 경우 해당 작업이 잡큐에 존재하지 않는다는 메세지를 받게 될 것 입니다.
Altering a Job
잡 큐에 있는 작업을 변경하기 위해 DBMS_JOB 패키지의 CHANGE, WHAT, NEXT_DATE 혹은 INTERVAL 프로시저를 사용할 수 있습니다. 오직 자신이 소유하고 있는 작업만 변경할 수 있습니다.
CHANGE
DBMS_JOB.CHANGE 프로시저를 이용하여 사용자가 정의한 어떠한 파라메터도 수정할 수 있습니다. 다음 예제를 참고하세요.
BEGIN
DBMS_JOB.CHANGE(14114, NULL, NULL, 'SYSDATE +3');
END;
/
WHAT, NEXT_DATE 혹은 INTERVAL 을 NULL 값으로 정하면 기존에 있는 값이 변동되지 않고 그대로 유지되게 됩니다.
WHAT
DBMS_JOB.WHAT 프로시저를 이용하여 작업을 변경할 수 있습니다.
BEGIN
DBMS_JOB.WHAT(14114,
'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',''HR'',''DEPARTMENTS'',''ESTIMATE'',
NULL,50);');
END;
/
NEXT_DATE
DBMS_JOB.NEXT_DATE 프로시저를 이용하여 다음 수행될 시간을 변경할 수 있습니다.
BEGIN
DBMS_JOB.NEXT_DATE(14114, SYSDATE + 4);
END;
/
INTERVAL
DBMS_JOB.INTERVAL 프로시저를 이용하여 작업과 작업 사이의 간격을 결정할 수 있습니다.
BEGIN
DBMS_JOB.INTERVAL(14114,'NULL');
END;
/
위 예시의 경우 작업은 더이상 수행되지 않고 잡 큐에서 제거될 것 입니다.
Broken Jobs
오라클은 BROKEN 플래그가 있는 작업은 수행하지 않습니다. 하지만 DBMS_JOB.RUN. 프로시저를 이용하여 강제로 작업을 수행할 수 있습니다.
How a Job Becomes Broken
실패하지 않을거라 생각되는 작업을 잡 큐에 넣습니다. 그럼에도 BROKEN 이 발생하는 경우는 다음과 같습니다.
- 16번의 재시도가 모두 실패할 경우
- DBMS_JOB.BROKEN 을 이용하여 작업에 BROKEN 플레그를 설정한 경우
BEGIN
DBMS_JOB.BROKEN(14114);
END;
/
오라클은 한번 BROKEN 마크를 단 작업은 사용자가 BROKEN 마크를 해제하기 전까지나 DBMS_JOB.RUN 프로시저를 호출하지 않는한 다시는 수행하지 않습니다.
다음 예시는 BROKEN 으로 표시된 14114 작업을 다음 월요일 에 수행될 수 있도록 하는 방법입니다.
BEGIN
DBMS_JOB.BROKEN(14114, FALSE, NEXT_DAY(SYSDATE, 'MONDAY'));
END;
/
Running Broken Jobs
16번의 작업 실패가 일어났다면 작업은 BROKEN 으로 표시됩니다. 문제를 해결했다면 다음 방법을 통해 작업을 재개할 수 있습니다.
- DBMS_JOB.RUN 을 통한 강제 수행
- DBMS_JOB.BROKEN 을 통한 BROKEN 플레크 해제
DBMS_JOB.RUN 프로시저를 통해 강제로 작업을 수행하면 오라클은 해당 작업을 즉시 수행합니다. 작업이 성공적으로 수행되면 BROKEN 플레그는 해제되며 실패 횟수가 초기화 됩니다.
Forcing a Job to Execute
작업을 스케쥴에 맞춰 수행하는 것이 아닌 직접 수행해 주어야 할 때가 있을 수도 있습니다. 실패한 작업을 수정을 했을경우 수정한 작업을 바로 수행시켜 보고 싶을 것 입니다. 작업을 강제로 수행하기 위해서는 DBMS_JOB 패키지의 RUN 프로시저를 사용합니다.
DBMS_JOB.RUN 프로시저를 수행할때 다음번 작업이 시작할 시간을 다시 계산 합니다. 예를들어 월요일에 작업을 새로 작성하면서 NEXT_DATE 값으로 SYSDATE를 주고, INTERVAL 에 'SYSDATE +7' 이라고 정해주었다면 해당 작업은 매 월요일에 수행 될 것 입니다. 하지만 수요일날 RUN 프로시저를 사용하여 강제로 작업을 수행했다면 다음 작업이 수행되는 날은 다음주 수요일이 될 것 입니다.
다음 구문은 14114 작업을 현 세션에서 수행하고 다음 수행날자를 재 계산하여 입력되는 예제 입니다.
BEGIN
DBMS_JOB.RUN(14114);
END;
Terminating a Job
수행중인 작업을 중지시키는 방법으로 해당 작업에 BROKEN 플레그를 설정하고 해당 작업이 수행되는 세션을 확인한 다음 그 세션을 잘라내는 방법을 사용합니다. BROKEN 설정을 하는 이뉴는 오라클이 해당 작업을 다시 수행하지 않게 하기 위함 입니다.
작업을 수행하는 세션을 확인후에 (V$SESSION 혹은 V$LOCK 뷰를 이용합니다.) SQL 구문인 ALTER SYSTEM 으로 해당 세션을 잘라낼 수 있습니다.
Viewing Job Queue Information
다음에 나열된 딕셔너리 뷰를 통하여 잡 큐와 작업에 대해 확인할 수 있습니다.
- DBA_JOBS, ALL_JOBS, USER_JOBS
DBA 뷰는 데이터베이스 내의 모든 작업에 대하여 보여줍니다. ALL 은 현 사용자가 접근할 수 있는 모든 작업에 대한 리스트를 반환하며 USER 뷰는 현 사용자가 소유하고 있는 작업에 대해서만 보여줍니다. - DBA_JOBS_RUNNING
현 데이터베이스가 수행중인 작업의 목록을 보여줍니다. 이 뷰는 V$LOCK 뷰와 조인하여 잠금 (LOCK)을 가진 작업을 확인할 수 있습니다.
Displaying Information About a Job
다음 쿼리는 작업 번호, 다음 수행일, 실패 횟수, BROKEN 상태를 보여줍니다.
SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN
FROM DBA_JOBS;
Displaying Information About Running Jobs
현재 수행중인 작업만 조회하여 볼 수도 있습니다. 다음 쿼리는 현제 데이터베이스가 수행중인 작업에 대하여 세션 식별자(Session Identifier -SID), 작업 번호, 작업을 등록한 사람, 그리고 시작 시간을 보여줍니다.
SELECT SID, r.JOB, LOG_USER, r.THIS_DATE, r.THIS_SEC
FROM DBA_JOBS_RUNNING r, DBA_JOBS j
WHERE r.JOB = j.JOB;
Fin.
REF) Oracle documents (server.920/a96521)
댓글 없음:
댓글 쓰기