TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-05-19 |
제목 | ORACLE REPLICATION을 이용하지 않고 SYNC 방식의 TABLE 복제(양방향) 방법 | ||
---|---|---|---|
ORACLE REPLICATION을 이용하지 않고 SYNC 방식의 TABLE 복제(양방향) 방법
==================================================================== 전체적인 개념을 설명하면 복제하고자 하는 table에 trigger를 만들어서 해당 table에 변경(insert, delete, update)이 발생하면 해당 trigger에서 remote database의 복제 table에 같은 작업을 해주는 방법이다. 여기서 주의해야 하는 것은 보통의 방법으로 trigger를 생성하다 보면 무한 loop로 빠지기 때문에 주의를 기울여서 생성해야 한다. 이 때 사용하는 방법은 oracle replication에서 제공되는 dbms_reputil package의 dbms_reputil.from_remote 변수를 이용하여 trigger에서 현재 transaction이 local에서 발생한 것인지 아니면 remote에서 발생한 것인지 파악하여 만약 remote에서 발생한 것이면 trigger가 수행하지 않고, local 에서 발생한 것이면 trigger가 수행하여 remote의 table을 변경한다. 자세한 구성 방법은 아래와 같이 생성한다. * 필요 요소. 1. sql*net v2 setting. 2. database link. 3. demo table. 4. trigger에서 remote database를 변경하는 package. 5. trigger * 구성 방법 1. 1번과 2번은 양쪽 database(master, client)모두 구성되어 있다고 가정한다. 이에 대한 자세한 내용은 SQL*NET, Distributed Database Manual을 참조. ex) database link 생성. create database link hikim.world connect to scott identified by tiger using 'hikim'; 여기서 using절의 'hikim'은 sql*net의 tnsnames.ora에 지정된 상대방 database의 alias이다. 2. demo table은 scott user의 emp table을 이용한다. 3. trigger에서 사용되어지는 package를 생성한다. 이 package를 이용한 transaction은 dbms_reputil.from_remote를 true로 지정하고 작업하게 되어 remote database의 trigger에서 check되어 다시 transaction을 일으키지 않게 된다. ex) CREATE OR REPLACE PACKAGE EMP_DML AS PROCEDURE EMP_INSERT( P_EMPNO NUMBER, P_ENAME VARCHAR2, P_JOB VARCHAR2, P_MGR NUMBER, P_HIREDATE DATE, P_SAL NUMBER, P_COMM NUMBER, P_DEPTNO NUMBER); END; / show error CREATE OR REPLACE PACKAGE BODY EMP_DML AS PROCEDURE EMP_INSERT( P_EMPNO NUMBER, P_ENAME VARCHAR2, P_JOB VARCHAR2, P_MGR NUMBER, P_HIREDATE DATE, P_SAL NUMBER, P_COMM NUMBER, P_DEPTNO NUMBER) IS BEGIN DBMS_REPUTIL.FROM_REMOTE := TRUE; -- remote transaction을 알림. insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (p_empno, p_ename, p_job, p_mgr, p_hiredate, p_sal,p_comm,p_deptno); DBMS_REPUTIL.FROM_REMOTE := FALSE; -- remote transaction을 막음. END EMP_INSERT; END EMP_DML; / (8i에서는 DBMS_REPUTIL.FROM_REMOTE 부분을 사용안함) 이 예제에서는 insert에 대한 것만 만들었는데 update, delete도 이를 응용하여 생성하면 될 것이다. 주의 할 점은 dbms_reputil.from_remote는 session별로 처음에는 FALSE값을 가지게 된다. 또한 user가 임의로 dbms_reputil.from_remote의 값을 true로 지정하게 되면 remote database로 변경내용이 전달되지 않는다. 이를 반대로 생각하면 만약 network이 문제가 되었을 경우 이 변수를 TRUE로 하여 우선 local database만이라도 정상적으로 운영되도록 할 수 있다. 4. trigger 생성. trigger에서는 현재 transaction이 local인지 remote인지 확인하여 만약 local 이면 위에서 만든 package를 이용하여 remote database를 변경하게 된다. ex) create or replace trigger emp_insert_tr before insert on emp for each row begin -- remote에서 발생된 tx이면 return if dbms_reputil.from_remote then return; end if; -- remote db insert using remote package emp_dml.emp_insert@prem734.kr.oracle.com(:new.empno, :new.ename, :new.job, :new.mgr, :new.hiredate, :new.sal, :new.comm, :new.deptno); end; / 즉, package, trigger, database link는 각각의 database에 생성되어져야 한다. 참고로, 위 program을 수정 없이 사용하여 생기는 문제는 oracle에 없으며, 사용하기 전에 충분한 test와 업무에 맞도록 수정하여 사용하시기 바랍니다. |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |