OGG 11.2.0.1.0 COLMAP v1.0
12.07.18 |
|
|
|
|
|
|
|
|
1. COLMAP of OGG
OGG 에서 Column 을 맵핑하기 위해 사용한다.
2. Notice of using COLMAP
Source 와 Target 의 Column 구조가 OGG 가 정의한 것과 동일해야 한다.
데이터베이스 타입이 동일해야 한다.
동일 Character set 과 locale 을 가져야 한다.
같은 수의 컬럼을 가져야 한다.
동일한 Column name 을 가져야 한다.
동일한 데이터 타입을 가져야 한다.
동일한 Column length 를 가져야 한다.
캐릭터 타입의 의미상 동일한 컬럼 길이를 가져야 한다.
모든 컬럼이 동일 순서를 가져야 한다.
COLMAP 을 서로 다른 구조에 사용하는 경우는 SOURCEDEFS, TARGETDEFS 를 설정해야 한다.
COLMAP 은 다음의 파라미터로 사용가능하다
- EXTRACT : TABLE
- REPLICAT : MAP
3. Syntax of COLMAP in OGG
(TABLE | MAP) <table spec>, TARGET <table spec>,
COLMAP ([USEDEFAULTS,] <TARGET COLUMN> = <SOURCE EXPRESSION>);
<SOURCE EXPRESSION>
대소문자 구분이나 특수문자 사용이 필요한 경우 GLOBALS 에 USEANSISQLQUOTES 를 넣고
“ “ 로 묶어 표현한다.
USEDEFAULTS
SOURCE 에서 TARGET 에 있어 Column 이름이 동일하면 자동맵핑한다. 사용하지 않는 경우에는 하나씩 다 기술해야 한다.
/*+ USEDEFAULTS 와 수동 맵핑 컬럼이 서로 중첩되면 어떤 것이 우선시 되는지? */
4. Example
MAP SALES.ACCTBL, TARGET SALES.ACCTAB,
COLMAP (USEDEFAULTS,
NAME=CUST_NAME
TRANSACTION_DATE=@DATE(“YYYY-MM-DD”,”YY”,YEAR,”MM”,MONTH,”DD”DAY),
AREA_CODE=@STREXT(PHONE_NO,1,3,));
@STREXT 는 ORACLE 의 SUBSTR 과 동일한 기능을 한다.
5. Failed Scenarios of COLMAP
l Source 와 Target 의 메타데이타가 다른 경우 Definition file 없이는 모든 시나리오가 실패한다.
테스트를 위해 소스에 SOURCE(A,B,C) 테이블을 만들 되 데이터 타입은 INT 타입으로 만들어 사용하였다.
A 컬럼에는 PK 설정을 하였다.
값의 입력은 다음의 명령어를 사용하였다.
insert into source
select level , trunc(DBMS_RANDOM.VALUE(1,100)), trunc(DBMS_RANDOM.VALUE(1,100))
from dual
connect by level < 11;
A. 컬럼순서를 변경
컬럼순서를 변경하여도 데이터가 동일하게 들어가는지 확인해 보았다.
TARGET(B,C,A) 테이블을 만들어 동기화를 해 보았다.
TARGET 의 REPLICAT 에 다음과 같이 맵핑룰을 정의하였다.
MAP TEST.SOURCE, TARGET TEST.TARGET,COLMAP(USEDEFAULTS);
위 맵핑의 결과로 A,B,C 의 데이터가 B,C,A 로 맵핑되길 원한다.
단순히 컬럼의 순서만 바뀌고 데이터는 온전하길 원한다는 이야기다.
위 결과는 다음과 같이 나왔다.
<Source> A B C ---------- ---------- ---------- 1 88 73 2 70 20 3 42 88 4 22 45 5 93 72 6 45 98 7 39 75 8 11 56 9 90 71 10 8 53
<Target> A B C ---------- ---------- ---------- 73 1 88 20 2 70 88 3 42 45 4 22 72 5 93 98 6 45 75 7 39 56 8 11 71 9 90 53 10 8 |
이는 의도하지 않은 결과이다.
insert into source(a, b, c)
select level , trunc(DBMS_RANDOM.VALUE(1,100)), trunc(DBMS_RANDOM.VALUE(1,100))
from dual
connect by level < 11;
위와같이 입력 쿼리를 수정하여 수행하여도 값이 의도하지 않는 결과와 동일하게 나왔다.
맵핑룰을 아래와 같이 다 정의를 해도 마찬가지의 결과가 나왔다.
MAP TEST.SOURCE, TARGET TEST.TARGET,COLMAP(A=A,B=B,C=C);
B. 일부 컬럼만 맵핑
TARGET(A, C) 테이블을 만들어 동기화 테스트를 해 보았다.
MAP TEST.SOURCE, TARGET TEST.TARGET; à 에러
2012-07-19 13:16:23 ERROR OGG-01161 Bad column index (2) specified for table TEST.SOURCE, max columns = 2.
위 REPA 의 report 를 보면 columns 의 수를 확인하는 것을 알 수 있다.
MAP TEST.SOURCE, TARGET TEST.TARGET,COLMAP(USEDEFAULTS);
위와같이 수정하여 수행해도 Columns 의 수 불일치로 아까와 동일한 에러가 발생한다.
MAP TEST.SOURCE, TARGET TEST.TARGET,COLMAP(A=A,C=C);
위의 경우도 마찬가지로 에러가 발생한다.
Target 측에 더미 컬럼 ‘D’ 를 넣고 위의 맵핑룰을 그대로 사용했을 때 다음과 같은 에러가 발생한다.
The following target columns were not mapped: D
예제를 통해 알 수 있는 건 Source 와 Target 의 메타데이타가 다를 때 사용자가 기대하지 않는 결과가 발생한다는 것이다.
이를 회피하기 위해서는 definition file 을 정의해야 한다.
6. Configuring Oracle GoldenGate to assume dissimilar metadata
l Ref.A 의 p174 를 참고한 내용이다.
Source 와 Target 의 테이블 정의가 동일하지 않을 때, OGG 는 한 포맷에서 다른 포맷으로의 변환작업이 필요하다. 컨버전을 위해서는, 소스와 타겟 두 개의 구성정의 파일이 필요하다.
소스 테이블의 구성정보를 담고 있는 A source-definitions file
타겟 테이블의 구성정보를 담고 있는 A target-definitions file
- 타겟에서 column mapping 과 conversion 을 수행하기 위해서는, Replicat 에 source definitions 을 제공하기 위해 소스쪽에서 생성 된 a source-definitions file 을 사용한다.
- 소스에서 column mapping 과 conversion 을 수행하기 위해서는, primary Extract 나 data-pump Extract 에 타겟의 구성정보 제공을 위해 타겟에서 생성된 target-definitions file 을 사용한다.
- 중계 시스템에서 column mapping 이나 transformation 을 수행하기 위해서는 multiple definition file type 을 사용한다.
Using a definitions template
Definition file 을 생성할 때, Initial Startup 이후에 추가되는 테이블에 대해 새로운 definitions files 를 생성 할 필요를 줄여줄 템플릿 지정이 가능하다.
템플릿을 사용하지 않고 startup 이후에 새로운 테이블이 추가되는 경우, 새로운 테이블이 추가 될 때마다 각각에 대해 definitions file 을 반드시 생성해 주어야 하며, 그 내용을 존재하는 master 의 definitions file 에 복사하고, process 를 restart 해야 한다.
7. Configuring Oracle GoldenGate to capture data-definitions
OGG 가 data-definitions file 과 템플릿을 사용도록 구성하기 위해서는 다음과 같은 과정이 필요하다.
- Configure DEFGEN
- Run DEFGEN
- Transfer the definitions file to the remote system
- Specify the definitions file
<Configure DEFGENT>
소스에서 다음과 같이 파라미터 셋팅을 한다.
GGSCI>EDIT PARAMS DEFGEN
( 위 명령을 실행하면 vi 가 오픈된다. 아래 내용을 복사,붙여넣기 하여 저장하고 종료한다.)
DEFSFILE /u01/ogg/dirdef/record.def USERID ogg, PASSWORD oggtest TABLE test.*; |
<Run DEFGEN>
defgen 은 definition file 을 생성하기 위한 명령어이다.
이 명령은 앞서 정의했던 defgen 을 이용하여 definition file 을 생성한다.
# defgen paramfile dirprm/defgen.prm [reportfile dirrpt/defgen.rpt] [NOEXTATTR] [UPDATECS UTF-8]
reportfile 부분은 화면에 출력하고자 하는 경우 생략해도 무관하다
NOEXTATTR 는 ASCII 를 지원하지 않는 11.2.1 이전 버전의 OGG 와 하위 호환성을 위해 사용된다. NOEXTATTR 은 DEFGEN 이 OGG 11.2.1 에서 소개 된 local 과 character set 과 관련된 국제화 특징들의 사용을 금지한다. 만약 테이블이나 컬럼이름에 공백과 같은 특수문자가 사용되면 NOEXTATTR 이 설정 된 경우 해당 테이블의 definition 을 포함하지 않는다. 만약 APPEND 모드가 사용되면, NOEXTATTR 은 무시되며, 존재하는 파일 포맷에 새로운 테이블 정의가 APPEND 된다.
UPDATECS 는 definitions file 의 캐릭터셋을 remote system 과 호환가능한 하나로 전환한다. |
<Transfer the definitions file to the remote system>
FTP 를 Binary mode 로 사용하여 파일을 Target 으로 옮긴다.
<Specify the definitions file>
다음의 방법으로 OGG 에 data-definitions file 을 연결한다
- Extract parameter file 에 TARGETDEFS 를 사용하여 Extract group 이나 datapump 에 연결한다.
- Replicat parameter file 에 SOURCEDEFS 파라미터를 사용하여 Replicat group 과 연결
- /*+ 중계서버에 대한 내용은 생략한다 */
8. Examples of using a definitions file
l 여기서는 target 에 sourcedefs 설정만 진행한다.
A. DEFGEN parameter 설정
GGSCI > EDIT PARAMS DEFGEN
(다음의 내용을 붙여넣는다.)
DEFSFILE /u01/ogg/dirdef/record.def USERID ogg, PASSWORD oggtest TABLE test.*; |
B. Run DEFGEN
# defgen paramfile ./dirprm/defgen.prm
test1[ogg1]@/u01/ogg>ls -lrt dirdef
total 8
-rw-rw-rw- 1 oracle oracle 1395 Jul 19 17:36 record.def
C. FTP 로 record.def 이동
/u01/ogg/dirdef 위치에 record.def 파일을 위치 시켰다.
D. record.def 파일을 Replicat 파라미터 파일에 지정
sourcedefs /u01/ogg/dirdef/record.def
E. 서로 다른 메타데이터 정보를 사용
<Target : Replicat Parameter>
MAP "TEST"."SOURCE", TARGET "TEST"."TARGET",COLMAP(A=A,C=B,B=C);
5번 샘플에서 값이 원하지 않는 위치로 섞여 들어갔던 현상이 없어지는 걸 확인할 수 있었다.
MAP "TEST"."SOURCE", TARGET "TEST"."TARGET",COLMAP(A=A,C=B);
위와 같이 일부 컬럼만 맵핑하는 것도 가능하다.
단 제약이 있는데 Target 의 모든 컬럼은 맵핑룰에 정의되어야 한다.
TARGET (A,C,B) 구성이면 B 에 대한 맵핑룰이 없다고 에러가 발생한다.
다른 컬럼명으로 맵핑
MAP "TEST"."SOURCE", TARGET "TEST"."TARGET",COLMAP(A=A,D=B);
컬럼을 추가적으로 가공
MAP "TEST"."SOURCE", TARGET "TEST"."TARGET",COLMAP(A=A,D=B,E=100);
9. References
A. Oracle GoldenGate Windows and UNIX Reference Guide 11g Release 2 Patch Set 1 (11.2.1.0.1)