Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-16
제목 Oracle 10g R2 에서 Scheduler (Job Chain) 사용 예제
PURPOSE
------------
10g R2 New feature 로 Scheduler 의 Job Chain 기능을 이용하면 JOB 의 상관관계를 부여할 수 있습니다.
아래의 Test Script 는 test_program_1 -> test_program_2 , test_program_3 동시 수행 ->
test_program_4 -> test_program_5 의 과정으로 수행되며, RBMS_SCHEDULER.define_chain_rule 시
condition 에서 논리 연산자로 조건을 부여하고, 각 step 의 program 이 성공적으로 끝난 다음 step 이
진행되게 됩니다.


Explanation
------------
1. test 유저 생성 및 권한 부여를 합니다.

CONN sys/password AS SYSDBA
DROP USER test CASCADE;

CREATE USER test IDENTIFIED BY test QUOTA UNLIMITED ON USERS;
GRANT CONNECT TO test;
GRANT CREATE TABLE TO test;
GRANT CREATE SEQUENCE TO test;
GRANT CREATE JOB TO test;

2. DBMS_RULE_ADM package 가 제공하는 subprogram 인 system_privilege 를 이용하여
TEST user 에 Job Chain 사용권한 부여합니다.
이 때, TEST user 에게 rule set, evaluation context, rule 권한을 줍니다.

- privilege : System privilege 권한명,
- grantee : User or Role,
- grant_option : TRUE or FALSE 로 Grant 권한을 줄 것인지 나타냄.

BEGIN
DBMS_RULE_ADM.grant_system_privilege(
privilege => DBMS_RULE_ADM.create_rule_set_obj,
grantee => 'TEST',
grant_option => FALSE);
DBMS_RULE_ADM.grant_system_privilege(
privilege => DBMS_RULE_ADM.create_evaluation_context_obj,
grantee => 'TEST',
grant_option => FALSE);
DBMS_RULE_ADM.grant_system_privilege(
privilege => DBMS_RULE_ADM.create_rule_obj,
grantee => 'TEST',
grant_option => FALSE);
END;
/

3. test 유저로 접속하여, Job Chain 실행을 위해 scheduler_test 테이블 및 시퀀스를 생성합니다..

CONN test/test

alter session set nls_date_format = 'yy-mm-dd HH24:MI:SS';

CREATE TABLE scheduler_test (
exec_order NUMBER(10) NOT NULL,
name VARCHAR2(20) NOT NULL,
exec_time DATE NOT NULL,
CONSTRAINT test_order_pk PRIMARY KEY (exec_order)
);

CREATE SEQUENCE test_order_seq;

4. 위에서 생성한 scheduler_test 테이블에 insert 하는 program 1,2,3,4,5 만듭니다.

BEGIN
DBMS_SCHEDULER.create_program (
program_name => 'test_program_1',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN
INSERT INTO scheduler_test (exec_order, name, exec_time)
VALUES (test_order_seq.NEXTVAL, ''test_program_1'', SYSDATE);
COMMIT;
END;',
enabled => TRUE,
comments => '1st Program in the chain.');
DBMS_SCHEDULER.create_program (
program_name => 'test_program_2',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN
INSERT INTO scheduler_test (exec_order, name, exec_time)
VALUES (test_order_seq.NEXTVAL, ''test_program_2'', SYSDATE);
COMMIT;
END;',
enabled => TRUE,
comments => '2nd Program in the chain.');
DBMS_SCHEDULER.create_program (
program_name => 'test_program_3',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN
INSERT INTO scheduler_test (exec_order, name, exec_time)
VALUES (test_order_seq.NEXTVAL, ''test_program_3'', SYSDATE);
COMMIT;
END;',
enabled => TRUE,
comments => '3rd Program in the chain.');
DBMS_SCHEDULER.create_program (
program_name => 'test_program_4',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN
INSERT INTO scheduler_test (exec_order, name, exec_time)
VALUES (test_order_seq.NEXTVAL, ''test_program_4'', SYSDATE);
COMMIT;
END;',
enabled => TRUE,
comments => '4th Program in the chain.');
DBMS_SCHEDULER.create_program (
program_name => 'test_program_5',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN
INSERT INTO scheduler_test (exec_order, name, exec_time)
VALUES (test_order_seq.NEXTVAL, ''test_program_5'', SYSDATE);
COMMIT;
END;',
enabled => TRUE,
comments => 'Last Program in the chain.');
END;
/

5. Chain “ test_chain_1 ” 을 생성합니다.

BEGIN
DBMS_SCHEDULER.create_chain (
chain_name => 'test_chain_1',
rule_set_name => NULL,
evaluation_interval => NULL,
comments => 'Testing chain');
END;
/

6. 위의 정의된 test_chain_1 에 대해 chain step 을 정의합니다.

BEGIN
DBMS_SCHEDULER.define_chain_step (
chain_name => 'test_chain_1',
step_name => 'chain_step_1',
program_name => 'test_program_1');
DBMS_SCHEDULER.define_chain_step (
chain_name => 'test_chain_1',
step_name => 'chain_step_2',
program_name => 'test_program_2');
DBMS_SCHEDULER.define_chain_step (
chain_name => 'test_chain_1',
step_name => 'chain_step_3',
program_name => 'test_program_3');
DBMS_SCHEDULER.define_chain_step (
chain_name => 'test_chain_1',
step_name => 'chain_step_4',
program_name => 'test_program_4');
DBMS_SCHEDULER.define_chain_step (
chain_name => 'test_chain_1',
step_name => 'chain_step_5',
program_name => 'test_program_5');
END;
/

7. 실제적으로 각 step 이 어떻게 수행될 것인지 chain rule 에 대해 정의합니다.
condition 의 경우는 논리 연산으로 조건을 부여하고, action 의 경우는 시작 interval
지정이 가능합니다. 또한, 동시에 두 개의 step 을 수행하도록 설정이 가능합니다.

BEGIN
DBMS_SCHEDULER.define_chain_rule (
chain_name => 'test_chain_1',
condition => 'TRUE',
action => 'START chain_step_1',
rule_name => 'chain_rule_1',
comments => '1st step in this chain');
DBMS_SCHEDULER.define_chain_rule (
chain_name => 'test_chain_1',
condition => 'chain_step_1 SUCCEEDED',
action => 'AFTER 00:00:05 START chain_step_2, chain_step_3',
rule_name => 'chain_rule_2',
comments => '2nd step in this chain');
DBMS_SCHEDULER.define_chain_rule (
chain_name => 'test_chain_1',
condition => 'chain_step_2 SUCCEEDED AND chain_step_3 SUCCEEDED',
action => 'AFTER 00:00:10 START chain_step_4',
rule_name => 'chain_rule_3',
comments => '3rd step in this chain');
DBMS_SCHEDULER.define_chain_rule (
chain_name => 'test_chain_1',
condition => 'chain_step_4 SUCCEEDED',
action => 'AFTER 00:00:05 START chain_step_5',
rule_name => 'chain_rule_4',
comments => '4th step in this chain');
DBMS_SCHEDULER.define_chain_rule (
chain_name => 'test_chain_1',
condition => 'chain_step_5 SUCCEEDED',
action => 'END',
rule_name => 'chain_rule_5',
comments => 'Final step in this chain');
END;
/

8. 위에서 생성한 test_chain_1 을 enable 상태로 만듭니다.

BEGIN
DBMS_SCHEDULER.enable ('test_chain_1');
END;
/

9. 현재 Job 이 수행되지 않았으므로, 데이터가 없음을 확인합니다.

SELECT * FROM scheduler_test ORDER BY exec_order;

10. 실제 test_chain_1_job 을 생성하고, 이를 실행합니다.

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'test_chain_1_job',
job_type => 'CHAIN',
job_action => 'test_chain_1',
repeat_interval => 'freq=minutely; bysecond=0',
start_date => SYSTIMESTAMP,
end_date => SYSTIMESTAMP + (1/48),
enabled => TRUE);
END;
/

11. 몇 분이 경과한 뒤에 Job 이 진행되었으므로 데이터 생성됨을 확인합니다.

SELECT * FROM scheduler_test ORDER BY exec_order;

12. 참고로, 위에서 생성한 Chain 의 내용은 Dictionary View 인 ALL_SCHEDULER_CHAINS,
DBA_SCHEDULER_CHAINS, USER_SCHEDULER_CHAINS 를 통해 조회하실 수 있습니다.


13. 테스트를 위해 생성된 Job, chain, program, test table, sequence, user 를 drop 합니다.

EXEC DBMS_SCHEDULER.drop_job(job_name => 'test_chain_1_job');
EXEC DBMS_SCHEDULER.drop_chain (chain_name => 'test_chain_1');
EXEC DBMS_SCHEDULER.drop_program (program_name => 'test_program_1');
EXEC DBMS_SCHEDULER.drop_program (program_name => 'test_program_2');
EXEC DBMS_SCHEDULER.drop_program (program_name => 'test_program_3');
EXEC DBMS_SCHEDULER.drop_program (program_name => 'test_program_4');
EXEC DBMS_SCHEDULER.drop_program (program_name => 'test_program_5');

DROP TABLE scheduler_test;
DROP SEQUENCE test_order_seq;
DROP USER test CASCADE;
Comment
등록된 코멘트가 없습니다.