OGG 11.2.0.1 Configuration for Data Warehousing v1.0
12.09.27 |
1.0 |
|
|
|
|
|
|
|
1. Data Warehousing
Data Warehouse 는 사용자의 의사 결정에 도움을 주기 위하여, 기간 시스템의 데이터베이스에 축적된 데이터를 공통의 형식으로 변환하여 관리하는 데이터베이스라 한다. (from Wikipedia) DW 는 복수의 소스로부터 데이터가 집중된다.
여기서는 복수의 소스로부터 데이터가 집중되는 구조, N:1 환경 구성에 대해 OGG 를 활용한 방법을 이야기 하고자 한다.
2. OGG Configuration for DW
N:1 구조를 만들기 위한 OGG 구성을 간단히 이야기 하면 다음과 같다.
먼저 소스쪽 이야기를 하겠다.
Capture 와 Pump 는 복제할 N 대만큼 필요하다. 다시말해 Database A 와 B 가 있다면 A 에 대한 capture 와 pump 가 필요하고, B 에 대해서도 capture 와 pump 가 필요하다.
물론 위 환경에 대해 각기 manager 프로세스도 필요하다.
다음으로 타겟 쪽 이야기를 하자면 다음과 같다.
타겟측은 N:1 구성에서 1에 해당하는 것으로 데이터가 집약되는 장소이다. N 개의 소스로부터 데이터를 전달 받으며 이는 N 종류의 trail file 에 씌여진다. 더불어 이를 적용할 Replicat 이 N 개 만큼 필요하다.
여기서 데이터 뿐만 아니라 시퀀스까지 동기화 하겠다고 하면 필요한 Replicat 수는 2N 개로 늘어난다.
( 이 문서에서는 Sequence 는 언급하지 않겠다. )
소스의 configuration 구성에 대해서는 리모트에 대해 trail 파일의 prefix 를 달리 가져가는 게 주의점이라 할 수 있다. 타겟의 configuration 구성에 대해서는 Replicat 이 어느 trail 파일을 읽을지 link 하는 부분이 중요하다.
3. Test Environment
l Source
Database : ‘ogg1’ 과 ‘dg1’ 을 사용했다. 두 인스턴스는 동일한 머신에 구성되어 있다.
OGG : /u01/ogg 와 /u01/ogg2 에 각기 설치되어 있다.
복제대상 : TEST 스키마
l Target
Database : ‘ogg2’ 를 사용했다.
OGG : /u01/ogg 에 설치되어 있다.
복제타겟 : ogg1 의 TEST 는 TEST1 으로, dg1 의 TEST 는 TEST2 로 맵핑
4. Configuration for DB
l Common
다음을 Source#1, #2, Target 에 수행한다.
in SYS… SQL> create user test identified by test;
SQL> grant connect, resource to test;
SQL> create table test.insert_test(time varchar2(6) primary key);
SQL> create or replace procedure test.insert_test_plsql as begin insert into insert_test values(to_char(systimestamp,'HH24MISS')); commit; end; / |
위 과정을 통해 복제 대상이 되는 test 스키마를 각기 생성하였고, 이 안에 insert_test 라는 테스트용 테이블을 만들었다. 마지막으로 insert_test 테이블에 데이터를 넣는 procedure 를 만들었다.
프로시저는 추후 event 를 통해 각 DB 에 따라 다른 주기로 호출하도록 만들 예정이다.
l Target
SQL> create user test1 identified by test;
SQL> grant connect, resource to test1;
SQL> create user test2 identified by test;
SQL> grant connect, resource to test2;
SQL> create table test1.insert_test(time varchar2(6) primary key);
SQL> create table test2.insert_test(time varchar2(6) primary key); |
Target 에는 test1, test2 스키마를 생성했다.
ogg1 의 test는 test1 스키마에, dg1 의 test 는 test2 스키마에 맵핑된다.
5. Configurations on Source (N)
l Source#1
<Manager>
PORT 7810 purgeoldextracts ./dirdat/*, usecheckpoints, minkeepdays 10, MINKEEPFILES 100 |
Manager 프로세스는 서비스 PORT 만 주의하면 된다.
하나의 소스에 OGG 를 두 개 띄울 것이기 때문에 서로 PORT 를 달리 가져간다.
ogg1 에 대한 OGG 는 7810 으로 셋팅했다.
<Capture>
extract capture
setenv (NLS_LANG = "KOREAN_KOREA.KO16KSC5601")
userid ogg, password oggtest
statoptions, reportfetch, reportdetail, resetreportstats report at 00:00 reportrollover at 00:01
discardfile ./dirout/eredo.dec, append, megabytes 100
discardrollover at 00:01
exttrail ./dirdat/er
TABLE TEST.*; |
Capture 의 경우 별도로 특이한 셋팅은 없다. capture 와 pump 에 대해 해당 OGG 는 홈디렉토리 밑에 고유한 디렉토리를 가지고 있기 때문에 소스간에 셋팅을 달리 가져갈 부분이 없다. 이를테면 로컬에 쌓이는 trail 파일도 이 케이스이다.
<Pump>
extract pump
userid ogg, password oggtest
statoptions, reportfetch, reportdetail, resetreportstats report at 00:00 reportrollover at 00:01
discardfile ./dirout/epump.dec, append, megabytes 100
discardrollover at 00:01
rmthost 192.168.137.202, mgrport 7810
rmttrail ./dirdat/og
TABLE TEST.*; |
pump 에서 가장 중요한 파라미터는 rmttrail 항목이다.
rmt 는 remote 를 의미하며, remote 즉 타겟에서 trail 파일 이름을 어떤식으로 만들 것인가를 의미한다.
2개의 소스와 1개의 타겟이 맵핑되어 있기 때문에 trail 파일은 서로 다르게 가져가야 한다.
l Source#2
<manager>
PORT 7830 purgeoldextracts ./dirdat/*, usecheckpoints, minkeepdays 10, MINKEEPFILES 100 |
2번 소스에 대한 서비스 포트는 7830 으로 1번과 다르게 가져갔다.
만약 두 개의 소스가 각기 다른 머신에서 동작중이었다면, PORT 를 달리 가져갈 필요는 없다.
<capture>
extract capture
setenv (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8") setenv (ORACLE_SID = "dg1")
userid ogg, password ogg
statoptions, reportfetch, reportdetail, resetreportstats report at 00:00 reportrollover at 00:01
discardfile ./dirout/eredo.dec, append, megabytes 100
discardrollover at 00:01
exttrail ./dirdat/er
TABLE TEST.*; |
capture 에는 oracle_sid 를 지정하기 위한 파라미터를 사용하였다.
Source #1 에는 별도로 지정하지 않은 이유는 .bash_profile 에 지정되어 있는 SID 가 ogg1 이기 때문에 별도로 지정하지 않았다.
<pump>
extract pump
setenv (ORACLE_SID = "dg1")
userid ogg, password ogg
statoptions, reportfetch, reportdetail, resetreportstats report at 00:00 reportrollover at 00:01
discardfile ./dirout/epump.dec, append, megabytes 100
discardrollover at 00:01
rmthost 192.168.137.202, mgrport 7810
rmttrail ./dirdat/dg
TABLE TEST.*; |
pump 에서 중요한 파라미터는 SID 에 대해 지정해 준 부분과, rmttrail 항목이다.
rmttrail 항목은 앞서 본 Source#1 의 pump 에서도 이야기 하였다.
l Target
<manager>
PORT 7810 purgeoldextracts ./dirdat/*, usecheckpoints, minkeepdays 10, MINKEEPFILES 100 |
Target 의 manager 파라미터 내용이다. 특이한 사항은 없다.
<replicat #1>
REPLICAT REPA
setenv (NLS_LANG = "KOREAN_KOREA.KO16KSC5601")
USERID ogg, PASSWORD oggtest
statoptions, reportfetch, reportdetail, resetreportstats report at 00:00 reportrollover at 00:01
discardfile ./dirout/repa.dec, append, megabytes 2000 discardrollover at 00:00
assumetargetdefs
MAP TEST.*, TARGET TEST1.*; |
discardfile 의 경로나 파일이름을 달리 가져가는 것과 ogg1 의 TEST 스키마 정보를 TEST1 에 맵핑하는 것이 유의할 점이다.
Replicat 과 trail 파일을 연결하는 작업은 명령어를 통해 이루어진다.
<replicat #2>
REPLICAT REPB
setenv (NLS_LANG = "KOREAN_KOREA.KO16KSC5601")
USERID ogg, PASSWORD oggtest
statoptions, reportfetch, reportdetail, resetreportstats report at 00:00 reportrollover at 00:01
discardfile ./dirout/repb.dec, append, megabytes 2000 discardrollover at 00:00
assumetargetdefs
MAP TEST.*, TARGET TEST2.*; |
replicat #1 과 내용 상 동일하다.
6. Additional Configurations on OGG and ORACLE
l Source #1, #2
서플리멘탈 로깅
GGSCI> dblogin userid ogg, password oggtest
GGSCI> add trandata test.*
GGSCI> info trandata test.* |
CAPTURE, PUMP 의 추가
GGSCI> add extract capture, tranlog, threads 1, begin now
GGSCI> add exttrail ./dirdat/er, extract capture, megabytes 1024
GGSCI> add extract pump, exttrailsource ./dirdat/er
GGSCI> add rmttrail ./dirdat/og, extract pump, megabytes 1024 è source#2 에서는 og 를 dg 로 사용한다. |
Source 에서는 add rmttrail 명령을 통해 Target 에 trail file 이름을 어떻게 사용할지 지정한다.
Source 가 2개이고 Target 은 하나이기 때문에 원격에서 사용할 trail 파일은 각 소스가 다른 이름을 가져가야 한다.
l Target
GGSCI> add replicat repa, exttrail ./dirdat/og, nodbcheckpoint GGSCI> add replicat repb, exttrail ./dirdat/dg, nodbcheckpoint |
Target 에서는 replicat 을 추가할 때 어떤 trail 파일을 사용할지 지정한다.
7. Starting OGG processes and Inserting Data
l All
Source#1, Source#2, Target 의 순서로 다음을 수행한다.
GGSCI> start mgr
GGSCI> start * |
위 과정까지로 데이터를 동기화하기 위한 절차는 모두 끝났다.
다만 여기까지의 과정은 DDL Replication 을 위한 방안은 무시된 것으로 Object 를 생성하는 경우,
Source 에 수행한 DDL 을 Target 에 수동으로 생성하는 것은 물론, 생성 시점 전후로 Extract, Replicat 을 stop / start 하는 과정이 필요하다.
l Source#1, Source#2
위 대상에 대해 data 를 insert 하는 procedure 를 호출 할 event 를 생성한다.
<Source #1>
SQL>BEGIN DBMS_SCHEDULER.create_job ( job_name => 'insert_test', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN test.insert_test_plsql; END;', start_date => SYSTIMESTAMP, repeat_interval => 'freq=secondly; ', end_date => NULL, enabled => TRUE); END; / |
<Source #2>
SQL>BEGIN DBMS_SCHEDULER.create_job ( job_name => 'insert_test', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN test.insert_test_plsql; END;', start_date => SYSTIMESTAMP, repeat_interval => 'freq=minutely;', end_date => NULL, enabled => TRUE); END; / |
위 Event 생성으로 Source 의 insert_table 에 데이터가 자동으로 입력된다.
8. Conclusion
N:1 연결에 있어 특이할 만한 부분은 다음 정도이다.
- 각 Source 에 OGG 를 구성, 구성상 특이점은 pump 가 remote 에 쌓을 trail file 의 prefix 를 다른 소스가 쌓을 trail file 과 중첩되지 않게 구성한다.
- Target 에서는 Replicat 을 소스 수만큼 추가한다. 또 add replicat 명령을 통해 어떤 replicat 프로세스가 어떤 trail 파일을 사용할지 지정한다.
9. References
A. 데이터 웨어하우스 | http://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%9B%A8%EC%96%B4%ED%95%98%EC%9A%B0%EC%8A%A4
B. CH7. Configuring Oracle GoldenGate for real-time data warehousing | Oracle GoldenGate Windows and UNIX Administrator's Guide 11g Release 2 Patch Set 1