TECH
QUESTION
자주하는 질문답변 입니다.
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 | |||
---|---|---|---|
등록된 코멘트가 없습니다. |