본문 바로가기

Oracle GoldenGate2

ORACLE GoldenGate 11g INSERTUPDATES v1.1

ORACLE GoldenGate 11g INSERTUPDATES v1.1

 

Date

Ver

Etc.

13.07.23

1.1

INSERTUPDATES 내용 보정

13.07.17

1.0

 

 

 

 

 

 

1.    INSERTUPDATES

INSERTUPDATES REPLICAT 에 사용하는 GoldenGate Parameter 이다.

 

위 파라미터는 존재하지 않는 ROW 에 대한 UPDATE 에 대해 INSERT 로 데이터를 복제해 준다.

(위 내용은 INSERTMISSINGUPDATES 에 대한 이야기다.)

 

위 파라미터는 UPDATE INSERT 로 처리한다.

 

처리되는 결과만을 보고 이야기 한다면 존재하지 않는 데이터에 대해서는 새로이 INSERT 된 결과를 얻고,

존재하는 데이터에 대해서는 PK 유무에 따라 결과가 달라진다.

 

PK 가 있는 경우 Replicat process 가 중지되며 ( INSERT 가 불가능 하기에) ,

PK 가 없는 경우 UPDATE 구문에 대해 INSERT 로 변환되어 정상 수행된다.

다만 원치않는 경우를 초래한다.

 

ex) PK 가 없는 경우  (1,1) 데이터에 대해 두 번째 컬럼의 데이터를 2 로 업데이트 하게 되면

타겟의 보유 데이터는 (1,1) 에서 (1,1), (1,2) 가 된다.

 

 

2.    ENVIRONMENT

<SOURCE : ORACLE>

동기화 대상 : CTEST ( ID, TXT )

ID PRIMARY KEY

CHARACTERSET KO16KSC5601 을 사용

 

<TARGET : MariaDB>

동기화 대상 : CTEST ( ID, TXT )

ID PRIMARY KEY

CHARACTERSET EUCKR 을 사용

DEFINITION FILE TABLE 구성 컬럼 타입이 바뀌었을 때 (CLOB 으로) 확인

 

3.    TEST OUTLINE

PRIMARY KEY INDEX 가 있을 때, NON-UNIQUE INDEX 가 있을 때, 인덱스가 없을 때, 컬럼 타입이 다를 때 definition file 의 차이

PRIMARY KEY INDEX 가 있을 때, NON-UNIQUE INDEX 가 있을 때, 인덱스가 없을 때 definition file 의 차이

PRIMARY KEY INDEX 가 있을 때, TXT 가 일반 문자열 일 때

PRIMARY KEY INDEX 가 없을 때 (NON-UNIQUE INDEX 가 있을 때와 없을 때), TXT 가 일반 문자열 일 때

PRIMARY KEY INDEX 가 있을 때, TXT CLOB 일 때

PRIMARY KEY INDEX 가 없을 때 (NON-UNIQUE INDEX 가 있을 때와 없을 때), TXT CLOB 일 때

INSERTUPDATES 를 이용한 데이터 복제

 

4.    TEST

PRIMARY KEY INDEX 가 있을 때, NON-UNIQUE INDEX 가 있을 때, 인덱스가 없을 때,

컬럼 타입이 다를 때 definition file 의 차이

 

OGG ADD TRANDATA 의 수행 유무는 definition file 의 내용에 영향을 끼치지 못한다.

 

 

PRIMARY INDEX 가 있을 때

 

Definition for table CTEST

Record length: 48

Syskey: 0

Columns: 2

ID   134     13        0  0  0 1 0      8      8      8 0 0 0 0 1    0 1 3

TXT   64     30       12  0  0 1 0     30     30      0 0 0 0 0 1    0 0 0

 

NON-UNIQUE INDEX 가 있을 때

 

Definition for table CTEST

Record length: 48

Syskey: 0

Columns: 2

ID   134     13        0  0  0 1 0      8      8      8 0 0 0 0 1    0 1 3

TXT   64     30       12  0  0 1 0     30     30      0 0 0 0 0 1    0 1 0

 

INDEX 가 없을 때

 

Definition for table CTEST

Record length: 48

Syskey: 0

Columns: 2

ID   134     13        0  0  0 1 0      8      8      8 0 0 0 0 1    0 1 3

TXT   64     30       12  0  0 1 0     30     30      0 0 0 0 0 1    0 1 0

End of definition

 

PRIMARY KEY 가 있고 컬럼 타입이 다를 때 (CLOB)

 

Definition for table CTEST

Record length: 4018

Syskey: 0

Columns: 2

ID   134     13        0  0  0 1 0      8      8      8 0 0 0 0 1    0 1 3

TXT   64   4000       12  0  0 1 0   4000   4000      0 0 0 0 0 1    0 0 0

End of definition

 

INDEX 가 없고 컬럼 타입이 다를 때 (CLOB)

 

Definition for table CTEST

Record length: 4018

Syskey: 0

Columns: 2

ID   134     13        0  0  0 1 0      8      8      8 0 0 0 0 1    0 1 3

TXT   64   4000       12  0  0 1 0   4000   4000      0 0 0 0 0 1    0 0 0

End of definition

 

Definition file 을 확인한 결과 다음의 사실을 알 수 있었다

 

l  Unique Index 의 유무에 따라 definition file 의 내용이 변경 됨

l  Non-Unique Index 의 유무는 definition file 의 내용에 영향을 미치지 않음

l  컬럼 타입이 달라지면 definition file 의 내용이 변경 됨

l  CLOB 컬럼이 들어간 경우 인덱스의 유무는 definition file 내용에 영향을 미치지 않음

 

아래 각 테스트 케이스에 대해선 모두 definition file 을 재생성하여 진행하였다.

 

소스가 1, ‘안녕’ 를 가지고 타겟이 데이터가 없는 상황에 1, ‘안녕하세요’ 로 update 할 때의 결과이다.

 

 

case 1. PRIMARY KEY INDEX 가 있을 때, TXT 가 일반 문자열 일 때

case 2. PRIMARY KEY INDEX 가 없을 때, TXT 가 일반 문자열 일 때

case 3. PRIMARY KEY INDEX 가 있을 때, TXT CLOB 일 때

case 4. PRIMARY KEY INDEX 가 없을 때, TXT CLOB 일 때

 

case 1

update 에 대해 해당 값이 타겟으로 복제 됨을 확인

case 2

update 에 대해 해당 값이 타겟으로 복제 됨을 확인

case 3

update 에 대해 해당 값이 타겟으로 복제 됨을 확인

case 4

update 에 대해 해당 값이 타겟으로 복제 됨을 확인

 

위 표를 보면 결과적으로 data type 에 상관없이 update 구문에 대해 insert 로 처리되었음을 볼 수 있다.

 

위 케이스는 타겟에 데이터가 없는 상황에 대해서 작업한 것으로 source target 에 데이터가

동일하게 있는 상황에서 update 를 실시하면 다음과 같은 결과를 얻는다.

 

case 1

replicat process 가 중지 됨

case 2

update 한 값이 새로이 insert 된다.

case 3

replicat process 가 중지 됨

case 4

update 한 값이 새로이 insert 된다.

 

case 2, 4 에 대해 GoldenGate log 를 확인해 보면 ‘SQL error 1062’ 를 확인할 수 있다.

이는 Duplicate entry 에러로 DML UNIQUE 제약조건을 위배하였기에 발생한 것이다.

 

INSERTUPDATES 를 이용한 데이터 복제

 

존재하지 않는 데이터에 대한 update GoldenGate Replicat parameter (INSERTUPDATES) 를 통해

데이터가 복제 (INSERT) 될 수 있다는 점은 상당히 매력적이다.

이 점을 이용해 소스에서 타겟으로 데이터 마이그레이션을 할 수 있지 않을까 생각할 수 있다.

 

Primary key 가 구성되어 있는 상황에서 다음과 같이 쿼리를 수행하였다.

(테스트를 위해 테이블 구조를 바꿨다.)

 

update ctest set prd_no = prd_no;

 

위에서 prd_no primary key column 이다.

위 결과로 위 테이블이 가지고 있는 rows 수 만큼 타겟에 복제되었다.

 

하지만 내용을 조회하면 prd_no 를 제외한 모든 컬럼은 NULL 값이 들어가 있었다.

골든게이트는 리두로그, 아카이브 로그에서 데이터를 추출하는 걸 생각하면 이 일은 당연한 것이다.

 

update ctest set 컬럼1 = 컬럼1, 컬럼2 = 컬럼2,

 

위와 같이 전 컬럼에 대해 update 를 수행하면 타겟측에 데이터가 복제되는 걸 확인할 수 있었다.

 

다만 위와 같은 사용은 프로덕션에 부적합하며 비현실적이다.

 

추가로 update 구문을 사용하는 방법 외에 supplemental logging 을 사용하는 방법이 있다

 

ALTER TABLE TABLE_NAME ADD SUPPLEMENTAL LOG GROUP GROUP_NAME ( COLUMN_NAME ) ALWAYS;

 

위와 같이 사용하는 방법인데 CLOB 컬럼에는 사용할 수 없는 방법이다.

 

결론으로 각 컬럼에 대해 update 하는 방법과 일반적인 데이터 타입의 테이블에 대해서는

ALTER TABLE ADD SUPPLEMENTAL LOG GROUP (COLUMN_LIST) 에 복제가 필요한 컬럼을 추가하여 복제할 수 있다.