[ Oracle - DB Scheduler_스케쥴러 ]

 

오라클 Scheduler

0. 왜 사용했을까?

 

WEB 프로젝트 수행 도중 LINK된 TABLE의 Data를 1분간격으로 가져와서 WEB Server 내 DB의

Summary Table에 Insert 또는 Update 처리를 하는프로그램이 필요하게 되었다.

 

먼저 PL/SQL로 프로시져를 작성하고 이를 호출하여 사용하는데 대개의 처리방식은 다음과 같다.

 

- C프로그램: OCI (로켓프로그램에 사용된다나 뭐라나.. 암튼 일반적으로는 거의 사용 안함?)

- C프로그램: Pro*C (가장 일반적으로 사용하는 방법)

- 자바: JDBC사용

- PL/SQL서버페이지

- 내장패키지 DBMS_JOB을 이용 (Oracle DB가 주기적 실행)

 

위 처리방법 중 DBMS_JOB을 알아본 결과 사용법도 쉽고 C프로그램 안해도 되고 성능도 좋은것 같아 사용하기로 결정!

 

1. DBMS_JOB 이란

 

DBMS_JOB이란 쉽게 말해 오라클에서 주기적으로 수행되는 Backup작업이나, 쿼리나 Stored Procedure등의

JOB들을을 시간단위나 일단위나 월단위 등 주기적인 예약 작업으로 등록하여 동작할 수 있도록 하는 스케쥴러라고

보시면 됩니다. UNIX에서 cron에 등록하여 사용하는 것과 유사한데 차이점은 cron job은 OS가 직접 관리하고

실행하지만 DBMS_JOB에 등록된 JOB은 오라클이 관리를 한다는 것입니다.

 

2.DBMS_JOB PACKAGE의 사용 방법과 예제

 

DBMS_JOB package를 이용하여 수행시킬 수 있는데, 이것을 위해서는 SNP background process start되어

있어야 합니다.

다음의 parameter를 init.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이 실행된다.

 

스케쥴러 가능내역 확인 테이블

 

SQL> col what format a20

SQL> select what, 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시를 지정했음.

 

'(DB) Oracle > Object & Utility' 카테고리의 다른 글

Oracle - Gateway 사용 하기  (0) 2017.01.21
Oracle - Export/Imprt  (0) 2017.01.21
Oracle - DB Link  (0) 2017.01.21
Oracle - DATABASE LINK 사용 방법  (0) 2017.01.21
Oracle - DATABASE LINK 사용 방법  (0) 2017.01.21
Posted by 농부지기
,