OGG 11.2.0.1.0 Map and Filter
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> : 필터가 실패할 때 유저가 설정한 숫자를 호출한다.
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;
<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;
<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; |
위 작업 이후 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