본문 바로가기

Oracle GoldenGate2

OGG 11.2.0.1.0 Map and Filter v1.0

OGG 11.2.0.1.0 Map and Filter

 

Date

Ver

Etc.

12.07.09

1.0

 

 

 

 

 

 

 

 

 

1.    Map and Filter

OGG CAPTURE, PUMP, EXTRACT PARAMETER MAP, TABLE, SEQUENCE 절로 대상을 표시할 수 있다.

MAP, TABLE, SEQUENCE 모두 Source object Target object 를 맵핑하는데 사용된다.

 

Filter 는 앞서 살펴 본 Mapping 대상에 대해 어떤 Records 를 적용할 것인가 필터링 하는데 사용된다.

2.    Mapping Rule

Object names 에 사용 가능 한 특수 문자는 다음과 같다. ( 괄호는 이스케이프 문자이다. )

* (\*), ?(\?), ?(\?), /, \(\\), @, #, $, %(%%), ^, (), _, -, 공백

 

Object names 에 사용 불가능 한 특수 문자는 다음과 같다.

{}, [], =, +, !, ~ , | , &, :, ;, , (쉼표), ‘’, “”, `, <>

 

Object names 에는 Oracle 이 지원하는 캐릭터셋을 사용할 수 있다.

오브젝트 이름에 스키마에 대한 정보가 없는 경우 로그인 세션의 기본 스키마 이름을 사용한다.

오브젝트 이름에 공백이나 심볼 같은 특수문자가 사용된 경우 “ “ 를 사용하여 지정한다.

“ “ case-sensitive 를 강제한다.

대소문자 구분을 위해 다음과 같이 오브젝트 이름을 지정한다.

TABLE “Sales”,”ACCOUNT”

 

Mapping Rule 에 와일드카드 ( *, ? ) 도 지원된다.

와일드 카드의 사용 규칙은 오브젝트 이름에 사용하며 owner 이름에는 사용하지 말라는 것이다.

 

와일드 카드 ? : 는 하나의 문자열을 대신하며,

와일드 카드 * : 0 개 이상의 문자열을 대신한다.

 

다음의 결과는 서로 각기 동일하다.

TABLE *;

TABLE “*”;

 

TABLE ?;

TABLE “?”;

 

참고로 와일드카드는 case-insensitive 로 대,소문자 구분이 없다.

 

다음은 와일드카드의 잘못된 사용예이다.

TABLE HQ.T_*, TARGET RPT.T_*;

MAP HQ.T_*, TARGET RPT.T_*;

 

위에 대해 아래와 같이 잘못 맵핑된다.

HQ.T_TEST1 => RPT.T_T_TEST1

HQ.T_TEST2 => RPT.T_T_TEST2

올바르게 맵핑해 사용하기 위해서는 아래와 같이 사용한다.

MAP HQ.T_*, TARGET RPT.*;

 

위에 대해 아래와 같이 맵핑된다.

HQ.T_TEST1 => RPT.T_TEST1

HQ.T_TEST2 => RPT.T_TEST2

 

기타 맵핑을 하지 않기 위한 파라미터로 TABLEEXCLUDE, MAPEXCLUDE 가 있다.

사용은 MAP, TABLE 과 동일하다

 

3.    Filtering Rule

l  Syntax

MAP <table spec>, TARGET <table spec>, FILTER (

[, ON INSERT | ON UPDATE | ON DELETE]

[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]

, <filter clause>

[, RAISEERROR <error>]

);

 

-      IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE : 특정 Operation 에 대해 필터를 적용하지 않는다.

-      <filter clause> :

ex : FILTER ((PRODUCT_PRICE*PRODUCT_AMOUNT)>10000))

, FILTER(@COMPUTE(PRODUCT_PRICE*PRODUCT_AMOUNT)>10000)

-      RAISEERROR <error> : 필터가 실패할 때 유저가 설정한 숫자를 호출한다.

 

4.    SCENARIO

l  s : source, t : target
오브젝트의 생성 전에 source capture, pump, target extract 를 정지한 상황에서
오브젝트 생성을 소스, 타겟에 대해 각기 진행하였다.

s1
DDL : create table s1(id int);
s2
DDL : create table s2(id int);

Source
capture, epump 셋팅
TABLE TEST.*;
SEQUENCE TEST.*;

Target
replicat 셋팅
MAP TEST.*, TARGET TEST.*;

A.     동일한 스키마, 동일한 오브젝트
s : MAP TEST.S1; / t : MAP TEST.S1 TARGET TEST.S1

ogg process
를 정지한 상태에서 s1 테이블을 source, target test schema 에 생성했다.
Source, Target
쪽 파라미터는 변경없다.

소스에서 다음의 SQL 을 실행했다.
insert into s1 select level from dual connect by level < 11;
commit;

타겟에서 결과가 전파됨을 확인했다.

B.     동일한 스키마 다른 오브젝트
s : MAP TEST.S1; / t : MAP TEST.S1 TARGET TEST.S2

앞서 ‘A’ 에서 사용했던 테이블을 그대로 두고 데이터만 0건으로 초기화 하였다.
replicat
에 다음의 파라미터 내용을 제거하였다.
MAP TEST.*, TARGET TEST.*;

replicat
에 다음의 파라미터 내용을 추가하였다.
MAP TEST.S1, TARGET TEST.S2;
이후 s2 테이블을 생성 후 다음의 SQL 을 소스에서 수행하였다

<Source>

 

insert into s1 select level from dual connect by level < 11;
commit;

 

<Target>

 

SQL> select count(*) from s1;

 

  COUNT(*)

----------

         0

 

SQL> select count(*) from s2;

 

  COUNT(*)

----------

        10

 

위와 소스의 s1 테이블이 타겟의 s2 테이블로 맵핑되었다.

 

C.     다른 스키마 동일한 오브젝트
s : MAP TEST.S1; / t : MAP TEST.S1 TARGET TEST_1.S1

 

타겟에 TEST_1 스키마를 생성하고 기본 권한을 할당했고, s1 테이블을 생성해 주었다.

 

SQL> create user test_1 identified by *****

  2  default tablespace test;

 

User created.

 

SQL> grant resource, connect to test_1;

 

Grant succeeded.

 

SQL> conn test_1

Enter password:

Connected.

SQL> create table s1(id int);

 

Table created.

 

Target Mapping Rule 을 다음과 같이 수정한다.

MAP TEST.S1, TARGET TEST_1.S1;

 

다음과 같이 SQL 을 수행하였다.

<Source>

 

insert into s1 select level from dual connect by level < 11;
commit;

 

<Target>

 

SQL> select count(*) from s1;

 

  COUNT(*)

----------

        10

 

 

D.     다른 스키마 다른 오브젝트
s : MAP TEST.S1; / t : MAP TEST.S1 TARGET TEST_1.S2


사전에 사용했던 테이블들에 대해 데이터 초기화 후

test_1 s2 테이블을 생성했다.

 

이후 Target replicat 파라미터를 다음과 같이 수정 후 데이터 입력을 진행했다.

<Target>

 

MAP TEST.S1, TARGET TEST_1.S2;

 

<Source>

 

insert into s1 select level from dual connect by level < 11;
commit;

 

위 작업 이후 Target s2 에 데이터 입력을 확인하였다.

SQL> select count(*) from s2;

 

  COUNT(*)

----------

        10

 

 

E.     동일한 스키마, 값에 따라 다른 오브젝트

각 테이블에 대해 데이터 건수를 0 으로 초기화 하였다.

Target 에는 s1, s2 테이블이 있고 Source 에는 s1 테이블이 있는 상태이다.

Souce s1 테이블에는 1 ~ 10 데이터를 Insert 할 것이며

Target s1 테이블엔 <=5 인 값 s2 테이블엔 >5 인 값을 Insert 하고자 한다.

 

Target Mapping 룰과 Filtering Rule 을 다음과 같이 사용한다.

MAP TEST.S1, TARGET TEST.S1, WHERE (ID > 4);

MAP TEST.S1, TARGET TEST.S2, WHERE (ID <= 4);

 

이후 다음과 같이 Insert 하여 Target s1, s2 테이블의 데이터를 조회해 보았다.

<Source>

 

SQL> insert into s1 values(2);

 

1 row created.

 

SQL> insert into s1 values (6);

 

1 row created.

 

SQL> commit;

<Target>

 

SQL> select * from s1;

 

        ID

----------

         6

 

SQL> select * from s2;

 

        ID

----------

         2

 

Replicat 에 셋팅한 조건에 따라 데이터가 각기 다른 오브젝트에 Insert 되었음을 확인하였다.

 

5.    References

A.     Oracle GoldenGate Windows and UNIX Administrator's Guide 11g Release 2 Patch Set 1 (11.2.1.0.1) |
Object naming Rule

 

B.     Oracle GoldenGate Windows and UNIX Reference Guide 11g Release 2 Patch Set 1 (11.2.1.0.1) |
Using Filter, Filter Syntax