본문 바로가기

Oracle GoldenGate2

OGG 11.2 REPLICATE INSERT v1.0

OGG 11.2 REPLICATE INSERT v1.0

 

Date

Ver

Etc.

12.09.19

v1.0

 

 

 

 

 

 

 

 

 

1.    Supplemental Logging

Redo-based application redo log files 에 추가적인 컬럼의 로깅을 요구한다. 이러한 추가 컬럼에 대한 로깅을 supplemental logging 이라 한다.

 

기본적으로 오라클 데이터 베이스는 아무 supplemental logging 을 지원하지 않는다.

 

다음은 추가적인 컬럼이 필요한 경우로 :

 

l  재구성 된 SQL 구문을 다른 데이터베이스에 적용해야 하며 update 구문을 row ROWID 가 아닌 컬럼집합으로 (예를들어, primary key) 유일하게 식별해야 한다. 왜냐하면 한 데이터베이스의 ROWID 는 다른 데이터베이스에서 서로 다를 것이고 의미가 없기 때문이다.

l  단순히 변경된 컬럼에 대한 정보 뿐만 아니라 로깅 된 전체 ROW before-image 를 요구하는 Application

 

GoldenGate Redo Log Files (Archived Log Files) 로부터 변경을 추출한다. 또 이 변경을 타겟 위치에 UPDATE 와 같은 DML 을 수행해야 한다. 이 과정에 UPDATE, DELETE 에 대해 ROW 를 정확히 식별해야 하는 요구사항이 발생한다.

 

하지만 앞서 본 것과 같이 ROWID 는 위 내용에서는 아무 도움이 되지 않는다. 그 이유는 서로 물리적으로 다른 데이터 베이스 이기에 동일한 ROW 에 대해 ROWID (물리적주소) 가 다를 수 있기 때문이다.

 

INSERT 의 경우 Supplemental Logging 없이도 OGG 를 통한 SYNC 에 문제가 없다고 한다.

여기서는 그 내용을 확인하려 한다.

 

2.    Test Environment

create table insert_test(time varchar2(6));

 

create or replace procedure insert_test_plsql

as

begin

insert into insert_test values(to_char(systimestamp,'HH24MISS'));

commit;

end;

/

 

in SYS

 

BEGIN

  DBMS_SCHEDULER.create_job (

    job_name        => 'insert_test',

    job_type        => 'PLSQL_BLOCK',

    job_action      => 'BEGIN test.insert_test_plsql; END;',

    start_date      => SYSTIMESTAMP,

    repeat_interval => 'freq=minutely; bysecond=0;',

    end_date        => NULL,

    enabled         => TRUE);

END;

/

 

insert_table 을 생성하여, insert_test_plsql 을 통해 varchar2 타입의 시분초를 입력받는다. 이후 inser_test 잡을 생성하여 1분마다 insert_test_plsql 을 호출하여 한 건의 데이터식 입력한다.

 

하단의 6에 대해서는 time 컬럼에 primary key 조건을 걸어 index 를 생성한다.

 

3.    Insert without Supplemental Logging (no primary index or Unique index on table)

다음의 에러가 Source 에서 발생한다.

2012-09-18 11:31:03  WARNING OGG-00869  Oracle GoldenGate Capture for Oracle, epump.prm:  No unique key is defined for table 'INSERT_TEST'. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.

 

Target 에서 다음의 에러가 발생한다.

2012-09-18 11:31:14  WARNING OGG-00869  Oracle GoldenGate Delivery for Oracle, repa.prm:  No unique key is defined for table 'INSERT_TEST'. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.

 

Source Target 에 동일한 내용의 에러가 발생한다.

 

OGG-00869 Oracle을 위한 Oracle GoldenGate Capture | Delivery : Table ??? 에 대해 Unique key 가 존재하지 않습니다. 모든 가능한 컬럼은 키를 나타내기 위해 사용되며, 독자성을 보장하지 못할 수 있습니다. KEYCOLS 가 키를 정의하기 위해 사용될 수 있습니다.

 

실제 Source Target 에 대해 Insert 된 데이터는 이상이 없었다.

 

4.    Insert with Supplemental Logging (no primary index or Unique index on table)

 

GGSCI (test1.daumcorp.com) 1> dblogin userid ogg,password oggtest

Successfully logged into database.

 

GGSCI (test1.daumcorp.com) 2> info trandata test.*

 

Logging of supplemental redo log data is disabled for table TEST.INSERT_TEST.

 

GGSCI (test1.daumcorp.com) 3> add trandata test.*

 

2012-09-18 14:07:39  WARNING OGG-00869  No unique key is defined for table 'INSERT_TEST'. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.

 

Logging of supplemental redo data enabled for table TEST.INSERT_TEST.

 

GGSCI (test1.daumcorp.com) 4> info trandata test.*

 

Logging of supplemental redo log data is enabled for table TEST.INSERT_TEST.

 

Columns supplementally logged for table TEST.INSERT_TEST: TIME.

 

Source Target 모두 ggserr 에 대해 WARNING OGG-00869 가 발생했다.

 

 

5.    Insert without Supplemetal Logging (with Primary Index)

테이블생성구문 : create table insert_test(time varchar2(6) primary key);

 

ggserr.log 에 별다른 에러가 발생하지 않았다.

 

GGSCI > info trandata test.* 결과에 대해서는 해당 테이블에 대해 Supplemental Logging disabled 되어 있음을 알 수 있었다.

 

GGSCI (test1.daumcorp.com) 3> info trandata test.*

 

Logging of supplemental redo log data is disabled for table TEST.INSERT_TEST.

 

 

6.    Insert with Supplemetal Logging (with Primary Index)

6번에서의 테이블 생성구문을 수행 후 add trandata test.* 으로 테이블 레벨의 서플리멘탈 로깅을 활성화 했다. 이 내용은 다음과 같이 확인할 수 있다.

 

SQL> select * from dba_log_groups

where owner = 'TEST'

/

  2    3

OWNER LOG_GROUP TABLE_NAME  LOG_GROUP_TYPE ALWAYS      GENERATED

----- --------- ----------- -------------- ----------- --------------

TEST  GGS_78163 INSERT_TEST USER LOG GROUP ALWAYS      USER NAME

 

l  참고 DBA_LOG_GROUPS

-      LOG_GROUP : LOG GROUP

-      TABLE_NAME : LOG GROUP 이 정의되어 있는 테이블 위치

-      LOG_GROUP_TYPE : LOG GROUP TYPE 이 표현 됨
* PRIMARY KEY LOGGING
* UNIQUE KEY LOGGING
* FOREIGN KEY LOGGING
* ALL COLUMN LOGGING
* USER LOG GROUP

-      ALWAYS : ALWAYS row 가 업데이트 될 때 로깅된다는 것을 의미하며,
다른 경우는 지정된 컬럼에 대해 업데이트 될 때 로깅 된다.

-      GENERATED : 서플리멘탈 로그 그룹이 시스템으로부터 생성되었는지(GENERATED NAME) 아닌지(USER NAME)를 말한다.

 

위 내용으로 보아 add trandata 를 실시하면 테이블 레벨의 서플리멘탈 로깅을 OGG 가 실시하는 것을 알 수 있다.

 

ggserr.log Source , Target 별다른 이상이 없었고, Insert 에 대한 데이터 동기화도 잘 되었다.

 

7.    Conclusion

 INSERT 에 대해선 Supplemental Logging Index (primary key) 유무와 상관없이 동기화에 아무 이상이 없었다. 다만 Index(primary key) 가 없는 경우에 대해서는 ggserr.log 에 에러가 발생했다.

 

8.    References

A.     19 Using LogMiner to Analyze Redo Log Files |

http://docs.oracle.com/cd/E14072_01/server.112/e10701/logminer.htm#i1021068