본문 바로가기
하기

ORACLE - JOB QUEUE

by khany 2008. 2. 15.

http://www.okjsp.pe.kr/bbs?act=VIEW&bbs=bbs2&seq=4942 퍼옴

DBMS_JOB PACKAGE의 사용 방법과 예제
==================================

Unix의 cron과 같이 오라클에서도 일정한 시점, 또는 간격으로 반복해서 job을
수행시킬 수 있다. DBMS_JOB package를 이용하여 수행시킬 수 있는데,
이것을 위해서는 SNP background process가 start되어 있어야 한다.

다음의 parameter를 init<SID>.ora file에 설정한 후 oracle을 startup하면
SNP process가 올라온다.

job_queue_processes = 1
-> 이 파라미터는 snp process를 몇 개 띄울지를 결정한다.
default=0

job_queue_interval = 60
-> 이 파라미터는 snp process가 깨어나는 간격을 초로 설정한다.


DBMS_JOB Package는 다음과 같은 procedure를 이용하여 사용한다.

DBMS_JOB.submit(job out binary_integer,
what in varchar2,
next_date in date defalut sysdate,
interval in varchar2 default 'null',
no_parse in boolean default false)

-> dbms_job.submit procedure는 job의 내용을 정의하고 oracle이 job을
수행할 수 있도록 한다. 다음의 예제를 통하여 실제 사용법을 알아보자.

[ 예제 ] file jobcre.sql

begin
dbms_job.submit(:jobno,
-- job 의 번호
'insert into scott.testdate values(1, sysdate);',
-- job의 내용 : ' '으로 감싸준다.
-- procedure를 실행하는 경우 ' username.procedure_name;' 만 쓰면 된다.

sysdate,
-- job이 실행될 시간

'sysdate + 5/24/60' ,
-- job이 실행되는 간격 , 위의 경우는 5분마다 실행하도록 했다.
-- ' '으로 감싸준다.

FALSE );
end;
/

$ sqlplus scott/tiger

SQL> variable jobno number;
SQL> @jobcre
SQL> print jobno -- job 번호 확인 : 여기서는 166번
SQL> exec dbms_job.run(166);
SQL> commit;

지금부터 interval에 따라 job이 실행된다.
job 실행 여부를 알아보기 위해서 다음의 sql 문장을 수행한다.

SQL> select job, next_date, next_sec, failures, broken
from user_jobs;

그 외에

SQL> exec dbms_job.run(jobno);
- job의 강제 실행, job이 16번 fail되어 broken된 경우는
위의 명령어로 강제로 run을 시켜서 실행되면 다시 interval마다
실행된다.

SQL> exec dbms_job.broken(jobno, TRUE);
- job을 disable시킴

SQL> exec dbms_job.remove(jobno);
- job의 삭제



snapshot과 job과의 관계
======================
snapshot 도 job 으로 등록되어 돌아갑니다.
즉, select job, what from dba_jobs; 를 조회하면,
what 부분에 snapshot 이 정의되어 있습니다.

따라서, snapshot 에 대한 disable 방법 등은 job 과 같습니다.


interval 시간 지정 예제
======================

1. 10분에 한번씩 실행하는 경우

sysdate + 1/24/6 또는 sysdate + 1/144
-> 1/24 (1시간-60분) / 6 : 10분 단위
1/144 : 24*6 으로 나누어도 같은 의미가 된다.

2. 1분에 한번으로 지정하는 경우

sysdate + 1/24/60 또는 sysdate + 1/1440


3. 매일 새벽 2시로 지정하는 경우

trunc(sysdate) + 1 + 2/24 -> 다음날 새벽 2시를 지정함.


4. 매일 밤 11시로 지정하는 경우

trunc(sysdate) + 23/24 -> 오늘 밤 11시를 지정했음.

from oracle.com



+++++++++++++++++++++++
[다른 예제]

DECLARE

  X NUMBER;

BEGIN

  SYS.DBMS_JOB.SUBMIT

    ( job       => X

     ,what      => '돌릴거 주로 sp;'

     ,next_date => to_date('01-01-2008 04:00:00','dd/mm/yyyy hh24:mi:ss')

     ,interval  => 'TRUNC(LAST_DAY(SYSDATE)) + 1 + 4/24'

     ,no_parse  => TRUE

    );

  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));

END;


+++++++++++++++++++++++


http://tong.nate.com/milk012/231467 퍼옴

oracle  에서 PL/SQL 코드를 정기적으로 수행되게 스케줄링하여 할 수 있도록 해준다.

cron 를 생각하면 된다.

아래는 oracle 에서 제공하는 메뉴얼을 예전에 회사 사람에게 주기 위해서 번역한 것이다.

대강해서 엉망이고..다 정리했던 문서를 찾을 수가 없어서 기본적인 것만..


Managing Job Queue

 

*SNP Background Processes

 

- performance를 극대화하고 많은 user를 관리하기 위해서,

muti-process oracle system은 backgound process의 추가의 process를 사용한다.

background process는 function을 관리하나 각 user process를 운영하는 multiple

process에 의해 관리된다. BG 는 더 좋은 performance와 신뢰를 위한

증대되는 병렬성을 제공하기 위해, 비동기적으로 i/o를 수행하고 다른 oracle process를 모니터한다.

 

SNP BG는 job queue 를 실행시킨다. 어떤 PL/SQL code를 job queue 를 사용하여 정기적으로 수행되는

스케쥴링을 할 수 있다. job을 스케쥴하기 위해, code를 job queue 에 등록하고 run 할 수 있게

job 에 빈도를 명시하면 된다. 또한 등록한 job을 alter, disable, delete 를 할 수 있다.

background 에 queued job을 실행시키기 위해 적어도 하나의 SNP process를 돌려야 한다.

SNP process는 어떤 queued job을 실행시키기 위해  일정하게 깨우고, 실행시킬 수 있다.

SNP process의 failure는 instance의 fail을 야기시키지 않기 때문에 SNP process는 다른 오라클 BG와는 다르다.

만약 SNP process가 fail되면 oracle를 재시작 하면 된다.

 

SNP BG는 만약 시스템이 restricted mode로 시작되면, job을 실행시킬 수 없다.

그러나, alter system으로 mode를 바꿀 수 있다.

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM DISABLE RESTRICTED SESSION;

 

restrited session을 enable로 설정하면, SNP BG는 job을 실행시킬 수 없다.

disable로 설정할 때, SNP BG는 job을 실행시킬 수 있다.

 

* Multiple SNP process

- instance는 SNP process를 36개(SNP0 - SNP9, SNPA - SNPZ)까지만 돌릴 수 있다.

만약 instance가 multiple SNP process를 가진다면(queued job을 실행시키는 task는

이러한 process를 공유할 수 있으므로), performance를 향상 시킬 수 있다.

그러나, 각 job은 오직 한번에 하나의 process만 run할 수 있다. single job은 multiple SNP

process에 의해 동시에 공유될 수 없다.

 

* Starting up SNP process

- job queue 초기 parameter는 SNP BG의 운영을 제어할 수 있게 해준다.

instance를 위한 초기 parameter에 이러한 parameter를 설정한다면,

그것들은 다음 번 instance를 시작할 때 영향을 미친다. job_queue_process paramter는

instance당 job queue process 수를 정의한다. 다른 instance는 다른 값을 가질 수 있다.

이 초기 parameter는 다음 예제와 같이 alter system 문으로 동적으로 변경할 수 있다.

ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 10;

 

job_queue_interval parameter는 SNP process간의 wake up 단위를 정의한다.

다른 instance는 다른 값을 가질 수 있다.

 

Managing job queues

* DBMS_JOB package

-          job queue 에 job을 스케쥴하고 관리하기 위해서, DBMS_JOB package에 있는 procedure 를 사용한다. Job queue 를 사용하기 위해 필요한 database 권한은 없다. Job queue procedure 를 실행 시킬 수 있는 user 라면, job queue 를 사용할 수 있다.

DBMS_JOB package 의 procedure 는 다음과 같다.

Procedure

설명

SUBMIT

Job queue에 job을 등록 시킨다.

REMOVE

Job queue로부터 특정 job 을 삭제한다.

CHANGE

Job queue에 이미 등록된 특정 job 을 변경시킨다.

WHAT

특정 job을 위한 job description 을 변경시킨다.

NEXT_DATE

특정 job 을 위한 다음 번 실행시간을 변경한다.

INTERVAL

실행 사이의 간격을 조정한다.

BROKEN

Job 실행을 disable 시킨다.

RUN

강제로 job run 시킨다.

 

 

*submitting a job the queue

-          job queue 에 새로운 job을 등록하기 위해서, DBMS_JOB 패키지에 있는 SUBMIT 프로시저를 사용한다.

SUBMIT 프로시저와 함께 사용할 수 있는 parameter는 다음과 같다.

 

 

Parameter

설명

JOB

Output parameter인 이것은 당신이 생성한 job에 식별자를 부여하는 것이다. Job 을 변경하든, 삭제하든 간에 job number을 반드시 사용해야만 한다.

WHAT

실행하고자 하는 PL/SQL 코드이다.

NEXT_DATE

Job 을 run 될때, next date이다. 디폴트 값은 Sysdate이다.

INTERVAL

다음 번에 실행하고자 할 때, 계산하는 date 함수이다.

디폴트 값은 NULL 이다. INTERVAL은 미래의 어떤 지점이나 NULL 값이여야 한다.

NO_PARSE

플래그이다. 만약 NO_PARSE가 false로 set되어 있다면, ORACLE은 job과 연관된 프로시저를 parse한다. ?? 잘몰겠네염…ㅡ.,ㅡ

 

예를 들어, job queue 에 새로운 job 을 등록해보면.. job 은 DQUON.ACCOUNTS table의 optimizer statistics 를 발생시키기 위해 DBMS_DDL.ANALYZE_OBJECT procedure를 call한다. 매일 한번씩 돈다…*^^*

ex) VARIABLE jobno number; 

BEGIN

             DBMS_JOB.SUBMIT(:jobno, ‘dbms_ddl.analyze_object(‘’TABLE’’, ‘‘DQUON’’, ‘’ACCOUNTS’’, ‘’ESTIMATE’’, NULL, 50);’, SYSDATE, ‘SYSDATE+1’_;

             COMMIT;

END;

/

참조 :

http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:633537913184



ora-12505
http://asktom.oracle.com/pls/ask/f?p=4950%3A8%3A%3A%3A%3A%3AF4950_P8_DISPLAYID%3A2328991547163