개발자의 끄적끄적

[oracle]오라클 Replication 기능에 대해[펌] 본문

개발/sql

[oracle]오라클 Replication 기능에 대해[펌]

효벨 2020. 8. 22. 02:00
728x90
반응형

[oracle]오라클 Replication 기능에 대해[펌]

 

 

오라클의 replication기능을 사용하면 될 듯합니다.

 

SCOPE
-----
Standard Edition 은 Symmetric Replication 은 가능하지 않으며, Oracle 8.1.6 이상 부터 Basic Replication 기능은 사용이 가능하다.
(Oracle8i server fully supports bi-directional replication with automated conflict detection and resolution. Supported configurations include a single updatable master site with multiple updatable or read-only snapshot sites.)


SYMMETRIC REPLICATION 구축 예제 (MASTER-MASTER)
==============================================


(1)  두 개의 Master Site 사이의 replication 환경을 구축하는 예를 script로
     작성하였다.
(2)  이 문서에서는 table 간의 conflict는 고려하지 않았으며, conflict 발생
     가능성이 있는 환경에서는 SCHEMA 구성 시 conflict를 고려하여 table을
     생성하여야 한다.
(3)  Oracle을 install하면 demo로 만들어지는 SCOTT/TIGER 의 dept, emp
     table을 이용하여 구축하였다.
(4)  이 문서에 포함된 모든 대,소문자는 문장 수행에는 전혀 관계가 없으며,
     단지 script의 이해를 돕기 위한 것 뿐이다.
(5)  Master Definition site의 global_name : MDS.WORLD
     Master Site의 global_name : MS.WORLD

REM******************************************************************
REM MASTER DEFINITION SITE SETUP: (master definition site에서 수행)
REM******************************************************************

REM global_name view를 확인한다. 결과는 db_name.db_domain 형태인
REM MDS.WORLD이다.
        sqlplus sys/manager
        SQL> select * from global_name;

REM global_name을 다음과 같은 형태로 다른 이름으로 변경할 수도 있다.
REM alter database rename global_name to NEW_NAME1.NEW_DBNAME2;

REM SYS user의 권한으로 remote site에서 replication 기능을 수행해야 하는
REM REPSYS user 생성
        SQL> drop user REPSYS cascade;

        SQL> create user REPSYS identified by REPSYS
                default tablespace USERS
                  temporary tablespace TEMP;
        SQL> grant connect, resource to REPSYS;
      SQL> execute DBMS_REPCAT_AUTH.GRANT_SURROGATE_REPCAT('REPSYS');

REM public database link를 만든다.
REM MSDB는 tnsnames.ora file 내에 master site의 database를 가리키는
REM alias 이름이다.
        SQL> drop public database link MS.WORLD;
        SQL> drop database link MS.WORLD
        SQL> create public database link MS.WORLD using 'MSDB';

REM database link를 만든 후에는 항상 잘 만들어졌는지 test해보아야 한다.
REM database link에 잘못된 username이나 alias name을 이용해도 database
REM link 생성 시에는 오류가 발생하지 않으나, 이후 deferred transaction이
REM 오류없이 전달되지 못하고 queue에만 쌓여 있는 현상이 발생한다.
        SQL> select * from global_name@MS.WORLD;

REM SYS user에서 REPSYS user로 private database link를 만든다.
        SQL> create database link MS.WORLD connect to REPSYS
             identified by REPSYS;
        SQL> select * from global_name@MS.WORLD;

REM replication Administrator user인 REPADMIN user 생성 & database
REM link 생성
        SQL> drop user REPADMIN cascade;
    
        SQL> create user REPADMIN identified by REPADMIN
                default tablespace USERS  
                temporary tablespace TEMP;
        SQL> grant connect, resource to REPSYS;

        SQL> execute DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_REPGROUP('REPADMIN');
        SQL> grant execute on DBMS_DEFER_SYS to REPADMIN
             with grant option;
    
        SQL> connect REPADMIN/REPADMIN
            SQL> create database link MS.WORLD connect to REPADMIN
             identified by REPADMIN;
        SQL> select * from global_name@MS.WORLD;
    
REM ****************************************************************
REM REMOTE MASTER SITE SETUP : (Master Site에서 수행)
REM ****************************************************************

REM global_name을 확인한다. 결과는 db_name.db_domain 형태인 MS.WORLD이다.
        SQL> connect sys/mansger

REM REPSYS user생성 & database link 생성
        SQL> drop user REPSYS cascade;

        SQL> create user REPSYS identified by REPSYS
                default tarblspace USERS  temporary tablespace TEMP;
        SQL> grant connect, resource to REPSYS;
        SQL>execute DBMS_REPCAT_AUTH.GRANT_SURROGATE_REPCAT('REPSYS');

REM MDSDB는 tnsnames.ora file 내에 master site의 database를 가리키는
REM alias 이름이다.
        SQL> drop public database link MDS.WORLD
        SQL> drop database link MDS.WORLD
        SQL> Create public database link MDS.WORLD using 'MDSDB*;
        SQL> select * from global_name@MDS.WORLD

REM SYS user에서 REPSYS로 database link 생성
        SQL> create database link MDS.WORLD connect to REPSYS
             identified by REPSYS;
        SQL> select * from global_name@MDS.WORLD

REM REPADMIN user 생성 & database link 생성
        SQL> drop user REPADMIN cascade;
    
        SQL> create user REPADMIN identified by REPADMIN
                default tablespace USERS temporary tablespace TEMP;
        SQL> grant connect, resource to REPSYS;

        SQL> execute              DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_REPGROUP('REPADMIN');
        SQL> grant execute on  DBMS_DEFER_SYS to REPADMIN with
             grant option;
    
        SQL> connect REPADMIN/REPADMIN
        SQL> create database link MDS.WORLD connect to REPADMIN
             identified by REPADMIN;
        SQL> select * from global_name@MDS.WORLD

REM ****************************************************************
REM schema 및 데이타 생성 (Master Definition Site에서 수행)
REM ****************************************************************

REM  SCOTT user 생성 및 권한 부여
        SQL> connect sys/manager
        SQL> drop user SCOTT cascade
      
        SQL> create user SCOTT identified by TIGER
              default tablespace USERS          temporary tablespace TEMP
        SQL> grant CONNECT, RESOURCE to SCOTT;
        SQL> grant EXECUTE on DBMS_DEFER to SCOTT;
      
REM SCOTT user의 database link 생성
        SQL> connect SCOTT/TIGER
        SQL> create database link MS.WORLD connect to SCOTT identified
             by TIGER;
        SQL> select * from global_name@MS.WORLD;
  
REM SCOTT user의 데이타 생성, Master Definition Site에서 생성하여야 한다.
REM ORACLE_HOME/sqlplus/demo/demobld.sql script를 이용하였으며,
REM 이 script 내의 DEPT, EMP table을 제외한 나머지 table에 관한 사항은
REM 삭제해도 된다.
REM replication하고자 하는 모든 table은 primary key가 정의되어 있어야
REM 한다.

    SQL> @$ORACLE_HOME/sqlplus/demo/demobld
    SQL> alter table DEPT add constraint DEPT_DEPTNO_PK PRIMARY KEY
             (DEPTNO);
    SQL> alter table EMP add constraint EMP_EMPNO_PK PRIMARY KEY
             (EMPNO);
    
REM *****************************************************************
REM SCOTT schema 생성 (Master Site에서 수행)
REM *****************************************************************

REM SCOTT user생성 및 권한 부여
        SQL> connect sys/manager
        SQL> drop user SCOTT cascade;
      
        SQL> create user SCOTT identified by TIGER      
                default tablespace USERS temporary tablespace TEMP
        SQL> grant CONNECT, RESOURCE to SCOTT;
        SQL> grant EXECUTE on DBMS_DEFER to SCOTT;
      
REM  database link 생성
     SQL> connect SCOTT/TIGER
     SQL> create database link MDS.WORLD connect to SCOTT
             identified by TIGER;
     SQL> select * from global_name@MDS.WORLD
      
REM ******************************************************************
REM Replication Objects 등록 (Master Definition Site에서 수행)
REM ******************************************************************

REM SCOTT replication group 생성, 반드시 replication group 이름과 schema
REM 이름이 같을 필요는 없다.
REM 아래의 CREATE_MASTER_REPGROUP을 수행시킴으로써, 이 site가 Master
REM Definition Site임을 지정하게 되는 것이다.

    SQL>connect REPADMIN/REPADMIN
    SQL> execute DBMS_REPCAT.CREATE_MASTER_REPGROUP('SCOTT');
      
REM SCOTT replication group 내에 DEPT replication object를 등록한다.
REM 여기에서와 같이 schema name과 group name이 같은 경우, gname 부분은
REM 생략해도 된다.
    SQL> execute DBMS_REPCAT.CREATE_MASTER_REPOBJECT ('SCOTT',
             'DEPT', 'TABLE' gname=>'SCOTT');
    SQL> execute DBMS_REPCAT.CREATE_MASTER_REPOBJECT ('SCOTT',
             'EMP', 'TABLE', gname=>'SCOTT' );
    SQL> execute         DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT('SCOTT','DEPT','TABLE');
    SQL> execute           DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT('SCOTT','EMP','TABLE');
      
REM 다음 query 문을 통해 replication object가 바르게 생성되었는지 확인한다.
        SQL> select * from DBA_REPOBJECT;
      
REM 다음을 수행하면 MS.WORLD site에 EMP, DEPT table과 데이타 및 관계된
REM object들이 생성되어, MS.WORLD site에서 dept와 emp를 조회하면 table과
REM data가 조회되어야 한다.
     SQL> execute DBMS_REPCAT.ADD_MASTER_DATABASE('SCOTT','MS.WORLD');
       여기서 전파자가 없다는 에러 메세지가 뜹니다.
REM 이제까지 수행한 DBMS_REPCAT package 수행에 오류가 있는지 확인한다.
        SQL> select ERRNUM, MESSAGE from DBA_REPCATLOG;
      
REM dba_repcat view를 조회하면 SCOTT group이 QUIESCED mode로 나타나므로,
REM NORMAL mode로 변경해야 dml 작업이 정상적으로 수행된다.
        SQL> execute DBMS_REPCAT.RESUME_MASTER_ACTIVITY('SCOTT');
      
REM 다음 query를 통해 SCOTT replication group이 NORMAL 상태로 변경되었는지
REM 확인한다.
        SQL> select * from DBA_REPCAT;
        SQL> select * from DBA_REPCAT@MS.WORLD;

REM*******************************************************************
REM Script6.sql asynchronos mode인 경우 자동 propagation 설정
REM (Mater Definition site에서 수행)
REM*******************************************************************

REM 이제 replication 환경의 설정은 끝났으며, 이러한 경우 data의
REM propagation mode는 asynchronous mode이다. asynchronous mode의 경우
REM MDS.WORLD 혹은 MS.WORLD에서 수행한 dml 작업이 자동으로 remote site로
REM 전달되고자 한다면 다음과 같이 SCHEDULE 설정한다. 이 예에서는 10초에
REM 한번씩 deferred queue에 쌓인 transaction을 propagate하도록 한다.

   SQL> execute DBMS_DEFER_SYS.SCHEDULE_EXECUTION('MS.WORLD',
                      'SYSDATE+10/86400', SYSDATE+10/86400);

REM ******************************************************************
REM asynchronous mode인 경우 자동 propagation 설정 (Mater site에서 수행)
REM ******************************************************************

REM master site에서도 자동으로 데이타의 변경 사항이 전달되도록 다음과 같이
REM 설정한다.

   SQL> exec DBMS_DEFER_SYS.SCHEDULE_EXECUTION('MDS.WORLD',
                     'SYSDATE+10/86400', SYSDATE+10/86400);

지나가다님이 2006-08-01 16:52:15에 작성한 댓글입니다. Edit 

 

"운영서버에 장애가 났을때 백업으로 있던 서버로 서비스하려고 DR서버를 구축하고 있습니다.

두 장비의 환경은 동일합니다. "

 

위와 같은 상황일때는 hotstandby 가 제일 적절 할꺼 같습니다.

hot 에서 발생 하는 아카이브를 standby에  적용하여 동기화 시키는 방법입니다.  hot서버에 부하도 없고 구현 하기도 간단 합니다

 

출처 : https://m.blog.naver.com/PostView.nhn?blogId=sungjs74&logNo=90009396129

반응형
Comments