본문 바로가기

Oracle GoldenGate2

OGG 11.2.0.1.0 COLMAP v1.0

OGG 11.2.0.1.0 COLMAP v1.0

 

Date

Ver

Etc.

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)