OGG 11.2.0.1.0 Initial Data Load Using CTAS v1.0
1. Initial Data Load on OGG
OGG 구성에 있어 초기적재하는 방법에서 CTAS (Create Table as Select) 를 사용할 수 있다. 초기적재 이후 동기화 부분에 있어 FLASHBACK 을 사용하면 PK 에 대한 중복에러 없이 깔끔하게 동기화 할 수 있다.
REPLICAT 을 시작할 때 AFTERCSN 옵션이 있다. 이 의미는 DB 의 SCN 과 동일한 의미로 동기화 시점을 지정할 수 있다. DB 에서는 SCN 이라는게 있고 이를 이용해 FLASHBACK QUERY 를 사용할 수 있다.
FLASHBACK QUERY 를 사용해 SCN (특정 DB 시각) 의 데이터 스냅샷을 얻을 수 있고 이를 이용해 초기적재를 실시한다.
FLASHBACK QUERY 는 UNDO TABLESPACE 를 이용하며 v$database.flashback_on 이 활성화 되어 있을 필요가 없다.
이 기술의 한계라고 하면 AS OF SCN 으로 지정할 SCN (혹은 TIMESTAMP) 데이터가 존재하지 않는 경우, 혹은 의미가 없어지는 경우이다.
전자의 경우는 일어날 일이 없을거라 생각되나, 후자의 경우는 초기 적재할 데이터의 양에 따라 발생할 가능성이 있다. 이를테면 초기적재를 완료하고 SCN 을 지정을 해 REPLICAT 을 시작하려 했으나 해당 SCN 의 trail 파일이 이미 age out 된 경우가 그런 경우이다.
2. Usage of FLASHBACK QUERY
일단 CTAS 이야기로 들어가기 전에 FLASHBACK QUERY 의 TARGET 에 대해 확인해 볼 필요가 있다.
‘원격지의 DB 에 대해 FLASHBACK QUERY 를 던질 수 있냐?’ 란 부분이다.
SQL> select count(*) from insert_test@ogg1 as of scn (timestamp_to_scn(systimestamp - 3/24/60)); select count(*) from insert_test@ogg1 as of scn (timestamp_to_scn(systimestamp - 3/24/60)) * ERROR at line 1: ORA-00900: invalid SQL statement |
왜 이런 에러 메시지가 나는지 모르겠지만 (소스쪽에서 DB LINK ALIAS 를 떼서 수행하면 에러나지 않는다.) 수행이 안 되는 걸 확인하였다.
소스쪽에서는 문제없이 수행된다.
SQL> select count(*) from insert_test as of scn (timestamp_to_scn(systimestamp - 3/24/60));
COUNT(*) ---------- 2722 |
결론은 CTAS 의 SEELCT 부분에 사용 될 테이블은 Local 위치의 Source 테이블이어야 한다.
3. Create Remote Table using CTAS
결론부터 이야기 하면 원격지에 DB Link 를 사용하여 create table 하는 액션은 금지되어 있다.
SQL> create table insert_test@ogg2 select * from insert_test; create table insert_test@ogg2 select * from insert_test * ERROR at line 1: ORA-02021: 원격 데이터베이스에 DDL 작업이 허용되지 않습니다 |
결국에는 문서의 제목을 바꿔야 하는 수준이다.
초기적재를 CTAS 를 이용하는게 아니라 INSERT-SELECT 를 이용해야 한다.
때문에 초기적재 시나리오는 테이블을 먼저 생성 후 진행되어야 하며, 원격지에 DDL 을 날리는 행위가 금지되어 있기에, Target 에서 DDL 을 수행해야 한다. 더불어 CTAS 로 데이터까지 한번에 끌어오면 좋겠지만 Target 입장에서 Source 에 Flashback 을 수행하는 행위가 불가능하다.
4. Initial Load and Sync Data (Outline)
사전 전제로 다음을 가정한다.
Source 측의 extract 는 이미 동작 중이고 DML 에 대해 Capture 활동 중이다.
Target 측에는 manager 만 구성되어 있고, Replicat 은 구성되어 있지 않다.
초기 적재는 다음과 같이 진행되겠다.
a. Target 에 Source 와 동일한 구조의 테이블을 생성, 방법은 다음과 같은 방법이 있을 것이다.
- expdp, impdp 를 이용한 방법
- Target 에서 CTAS 를 이용해 빈 테이블을 생성
SQL> create table insert_test 2 as select * from insert_test@ogg1 where rownum < 1; |
다만 위와 같은 방법을 사용하면 소스와 타겟 사이에 차이가 발생한다.
대표적으로 constraints 와 Index 차이이다.
이를 고려해 초기적재를 실시해야 할 것이다.
b. aftercsn 을 사용한 Replicat 시작
실제로는 Data pump 를 사용하지 않고, CTAS 로 빈 테이블을 만들어 사용하도록 하겠다.
5. Initial Load and Sync Data (Scenario)
l Target
SQL> create table insert_test 2 as select * from insert_test@ogg1 where rownum < 1; |
데이터를 초기 적재 할 테이블을 생성했다.
l Source
SQL> select timestamp_to_scn(systimestamp - 3/24/60) from dual;
TIMESTAMP_TO_SCN(SYSTIMESTAMP-3/24/60) -------------------------------------- 12621710
SQL> insert into insert_test@ogg2 2 select * from insert_test as of scn 12621710;
230258 rows created.
SQL> commit;
Commit complete. |
초기 적재할 테이블에 flashback-query 를 사용한 insert-select 로 3분전의 시점 (scn 을 이용한 시점에 시각) 으로 데이터를 로드하였다.
l Target
GGSCI> add replicat repa, exttrail ./dirdat/ep, nodbcheckpoint
GGSCI> start repa, aftercsn 12621710 |
scn 을 GoldenGate 의 aftercsn 을 이용하여 데이터 싱크를 시작하였다.
6. Future Tasks
위에서는 말 그대로 데이터만 동일하게 만들었을 뿐 사용하기 위한 환경은 만들어지지 않았다.
앞서 언급했듯이 인덱스와 제약조건이 전무한 상황이기 때문에 (CTAS 로 테이블을 생성했기 때문에) 이에 대한 작업을 진행해야 한다.
초기적재 작업에서는 인덱스와 제약조건이 없어도 되고 없는 편이 낫다. 그 이유는 초기적재를 위한 작업 속도 때문으로 데이터 적재가 끝난 후 인덱스 및 제약조건 추가를 하는편이 이득이다.
위를 고려해 작업을 고급화(단순화) 하기 위한 작업으론 아래와 같은 내용이 있을 것이다.
- Table 생성 스크립트
- 초기적재 (insert-select) 스크립트
- 인덱스 및 제약조건 생성 스크립트