[Oracle] Oracle GoldenGate(OGG) 동작 방식 / CDC 구성 예시

728x90

Oracle GoldenGate(OGG) 동작 방식 / CDC 구성 예시

대상: Source DB → Target DB 단방향 실시간 복제(CDC)
아키텍처: Classic Architecture (GGSCI 기반) - Classic Extract + Data Pump + Classic Replicat
예시 스키마: KING / OGG 계정: ogg


1. OGG 동작 방식

1.1 핵심 개념 - 논리적 복제(Logical Replication)

OGG는 데이터 블록을 그대로 복사하는 물리적 복제가 아니라, redo에 기록된 변경을 "행 단위 논리 변경"으로 추출해 Target에서 SQL로 재생하는 논리적 복제 방식이다. 이 성질 때문에 이기종·크로스버전·선택적 복제·양방향 구성이 가능하다.

핵심 결과는 하나다 - 커밋 순서가 보존된 논리적 변경의 스트림. 롤백된 트랜잭션은 애초에 실리지 않고, 커밋 시점에 순서대로 trail에 기록된다.

1.2 파이프라인 흐름

[Source 서버]                                         [Target 서버]
  redo/archive log
      │
      ▼
  Extract ──▶ Local Trail ──▶ Data Pump ──▶ (network) ──▶ Remote Trail ──▶ Replicat ──▶ Target DB
 (capture)     (dirdat/ea)     (PASSTHRU)                  (dirdat/ra)      (apply)
구성요소 역할 본 가이드의 이름
Extract redo에서 변경 캡처 → Local Trail 기록 EXTA
Local Trail 캡처 결과를 OGG 포맷 파일로 직렬화 ./dirdat/ea
Data Pump Local Trail을 읽어 네트워크로 Target 전송 PMPA (PASSTHRU)
Remote Trail Target 서버가 수신한 trail ./dirdat/ra
Replicat Remote Trail을 SQL(DML/DDL)로 변환·적용 REPA

1.3 OGG를 관통하는 3가지 설계 사상

  1. 논리적 복제 - 블록이 아니라 "행 변경의 의미"를 복제한다. 그래서 Target에서 행을 식별할 PK/UI 값이 반드시 필요하고, 이를 위해 보충 로깅(Supplemental Logging)이 전제된다.
  2. Trail 기반 디커플링 - Extract와 Replicat이 파일(trail)로 분리되어 서로의 속도차·장애를 흡수한다. Target이 잠시 내려가도 Extract는 Local Trail에 계속 쌓을 수 있다. 각 프로세스는 checkpoint로 처리 위치를 기록해, 죽었다 살아나도 정확히 재개한다.
  3. 커밋 순서 보존 - 캡처는 커밋 순서대로 실어 나른다. (Integrated/Parallel Replicat은 여기에 의존성 분석 기반 병렬 적용을 더한다.)

1.4 Classic vs Integrated - 이 가이드의 위치

구분 Classic (본 가이드) Integrated
캡처 방식 Extract가 redo를 직접 읽음 (DBLOGREADER로 DB의 로그리더 API 활용) DB 내부 LogMining server가 LCR로 재구성
DB capture 등록 없음 REGISTER EXTRACT 필요
메모리 튜닝 Extract의 CACHEMGR CACHESIZE STREAMS_POOL_SIZE (LCR 캐시)
압축·복잡 저장구조 지원 제한적(늦게 지원) DB가 알아서 해석

이 가이드는 Classic 구성이므로 STREAMS_POOL_SIZE·REGISTER EXTRACT는 사용하지 않는다. 대신 Extract 파라미터의 CACHESIZE가 트랜잭션 캐시 메모리를 담당한다. Integrated로 전환 시 필요한 항목은 3장에서 정리한다.


2. 설치 및 구성 절차 (단계별 이론·의미·주의사항)

2.1 OS 계정 및 환경변수 준비 Source Target

① OGG 전용 OS 계정 생성

useradd -g dba -G dba ogg
passwd ogg
su - ogg
  • 의미: oracle 계정과 OGG 운영/관리를 프로세스·권한 측면에서 분리하기 위해 전용 계정을 둔다.
  • 주의: dba 그룹에 넣어 Oracle 라이브러리·소켓 접근이 가능해야 한다.

② 환경변수 설정 (~/.bash_profile)

export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0.4
export OGG_HOME=/oracle/ogg
export PATH=$ORACLE_HOME/bin:$OGG_HOME:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:$OGG_HOME
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
  • 의미: OGG 프로세스가 Oracle 클라이언트 라이브러리(LD_LIBRARY_PATH)를 찾아야 DB에 접속할 수 있다.
  • 주의: NLS_LANG 캐릭터셋이 Source/Target·DB와 정합해야 한다. 불일치 시 문자 깨짐·변환 오류가 발생한다. LD_LIBRARY_PATH$ORACLE_HOME/lib가 빠지면 GGSCI가 DB 접속 시 라이브러리 로드 실패로 죽는다.

2.2 OGG 소프트웨어 설치

③ Source (OGG 11g) - 압축 해제만으로 설치 완료 Source

unzip V34339-01_112103_Linux-x86-64.zip
tar -xvf fbo_ggs_Linux_x64_oraXlg_64bit.tar -C /oracle/ogg
  • 의미: OGG 11g는 별도 인스톨러 없이 tar 해제 위치가 곧 OGG_HOME이 된다.

④ Target - runInstaller(사일런트) 설치 Target

unzip V983658-01.zip
cd /home/ogg/fbo_ggs_Linux_x64_shiphome/Disk1/response
vi oggcore.rsp          # INSTALL_OPTION, SOFTWARE_LOCATION 등 편집
./runInstaller -silent -responsefile /.../oggcore.rsp
  • 의미: 응답파일(oggcore.rsp)에 설치 옵션·경로를 미리 채워 무인 설치한다.
  • 주의: SOFTWARE_LOCATION이 환경변수의 OGG_HOME과 일치해야 한다. 설치 후 oraInventory 로그로 성공 여부를 확인한다.

2.3 DB 레벨 초기 설정 (sqlplus / as sysdba)

이 절이 CDC의 성패를 좌우한다. 아래 4개는 캡처가 데이터를 온전히·정확히 잡기 위한 전제조건이다.

⑤-1 Supplemental Logging 활성화 Source

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER SYSTEM SWITCH LOGFILE;
  • 의미: 평상시 redo는 "변경 컬럼 + rowid"만 기록한다. Target은 별개 DB라 rowid로 행을 찾을 수 없으므로, PK/UI 값을 redo에 항상 추가로 실어야 Apply가 행을 식별할 수 있다. 이 DB 레벨 최소 로깅은 그 전제조건이다.
  • 주의: 이건 "전제"일 뿐이며, 실제 테이블별 로깅은 2.5의 ADD SCHEMATRANDATA로 건다. 둘 다 해야 한다. 변경 반영을 위해 로그 스위치를 수행한다.

⑤-2 Force Logging 활성화 Source

ALTER DATABASE FORCE LOGGING;
  • 의미: Direct-path insert(/*+ APPEND */NOLOGGING 작업은 redo를 생략해 캡처에서 조용히 누락된다. FORCE LOGGING은 이를 DB 레벨에서 강제 무력화하는 안전장치다.
  • 주의: 실행은 온라인으로 가능하나, 진행 중인 direct-path 세션이 끝날 때까지 잠시 대기한다.

⑤-3 OGG 복제 파라미터 활성화 Source Target

ALTER SYSTEM SET enable_goldengate_replication=TRUE SCOPE=BOTH;
  • 의미: DBMS_GOLDENGATE_* 패키지 및 DB 로그리더(DBLOGREADER) 기능의 게이트 파라미터. GoldenGate 라이선스 보유가 전제다.
  • 주의: 동적 파라미터라 재기동 불필요.

⑤-4 OGG 계정 및 테이블스페이스 생성 Source Target

CREATE TABLESPACE ogg_ts DATAFILE '/oradata/HISDB/datafile/ogg_ts01.dbf'
  SIZE 1G AUTOEXTEND ON;
CREATE USER ogg IDENTIFIED BY manager0 DEFAULT TABLESPACE ogg_ts;
  • 의미: OGG 전용 스키마·전용 테이블스페이스를 둔다(체크포인트/heartbeat 등 OGG 오브젝트 격리).

⑤-5 OGG 계정 권한 부여 Source Target

GRANT DBA TO ogg;
BEGIN
  DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE(
    grantee        => 'ogg',
    privilege_type => '*',        -- capture+apply 모두
    grant_select_privileges => TRUE,
    do_grants      => TRUE);
END;
/
  • 의미: GRANT_ADMIN_PRIVILEGE가 캡처/적용에 필요한 권한 묶음을 한 번에 부여한다. privilege_type => '*'는 한 계정이 양쪽 역할을 모두 수행하도록 한다.
  • 주의: GRANT DBA는 편의상이지만 운영 환경에선 과도한 권한이다. 최소 권한 원칙을 지키려면 DBA 대신 필요한 개별 권한만 부여하는 것을 권장한다.

2.4 OGG 전역 설정 (su - ogg)

⑤-6 GLOBALS 전역변수 Source Target

GGSCHEMA OGG
CHECKPOINTTABLE OGG.GGSCHKPT
--ENABLE_HEARTBEAT_TABLE
--HEARTBEATTABLE GG_HEARTBEAT
SYSLOG NONE
  • 의미: OGG 메타데이터 스키마와 체크포인트 테이블 기본값을 전역 지정한다.
  • 주의: heartbeat는 end-to-end lag 모니터링용으로, 운영 시 주석 해제해 활성화하면 유용하다.

⑤-7 서브디렉토리 생성 Source Target

cd $OGG_HOME
./ggsci
GGSCI> create subdirs
  • 의미: dirdat(trail), dirprm(파라미터), dirchk(체크포인트), dirrpt(리포트) 등 작업 디렉토리를 일괄 생성한다.

⑤-8 Manager(mgr) 파라미터 Source Target

GGSCI> edit params mgr
PORT 7809
DYNAMICPORTLIST 7810-7820
ACCESSRULE, PROG *, IPADDR *, ALLOW
USERID ogg PASSWORD manager0
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3
AUTORESTART ER *, RETRIES 5, WAITMINUTES 2, RESETMINUTES 120
LAGCRITICALSECONDS 600
  • 의미: Manager는 OGG의 상위 관리 프로세스로 포트 리스닝·프로세스 자동재기동·오래된 trail 정리를 담당한다.
  • 주의: PURGEOLDEXTRACTS ... USECHECKPOINTS아직 처리 안 된 trail은 삭제하지 않도록 체크포인트를 확인한다 - 이 옵션이 없으면 미처리 trail이 지워져 데이터 유실 위험. DYNAMICPORTLIST 포트 대역을 방화벽에서 열어야 한다.

⑤-9 Manager 기동

GGSCI> start mgr
GGSCI> info all

2.5 Source 캡처 구성

⑥ DB 접속

GGSCI> dblogin userid ogg, password manager0

⑦ 대상 스키마 보충 로깅(SCHEMATRANDATA) Source

GGSCI> add schematrandata KING
GGSCI> info schematrandata KING
  • 의미: 2.3의 DB 레벨 로깅이 "전제"라면, 여기서 KING 스키마 내 모든 테이블(신규 포함)에 PK/UI 컬럼 보충 로깅을 자동 적용한다. 테이블 단위 ADD TRANDATA보다 누락 위험이 적어 다수 테이블에 적합하다.

⑧ Extract(EXTA) 파라미터 Source

GGSCI> edit params EXTA
EXTRACT EXTA
USERID ogg PASSWORD manager0
CACHEMGR CACHESIZE 2G
TRANLOGOPTIONS EXCLUDEUSER OGG
TRANLOGOPTIONS DBLOGREADER
DBOPTIONS ALLOWUNUSEDCOLUMN
EOFDELAYCSECS 10
GETTRUNCATES
WARNLONGTRANS 2h, CHECKINTERVAL 30M
EXTTRAIL ./dirdat/ea
TABLE KING.*;
  • 의미 (주요 파라미터)
    • CACHEMGR CACHESIZE 2G - 커밋 전 트랜잭션을 담는 캐시 메모리. Classic Extract의 메모리 튜닝 지점(Integrated의 STREAMS_POOL_SIZE에 대응).
    • TRANLOGOPTIONS EXCLUDEUSER OGG - OGG 자신의 트랜잭션을 캡처에서 제외해 복제 루프를 방지.
    • TRANLOGOPTIONS DBLOGREADER - DB의 로그리더 API로 redo를 읽어 성능·ASM 대응을 개선.
    • WARNLONGTRANS 2h - 2시간 넘게 미커밋인 롱 트랜잭션 경고(Extract가 이를 메모리에 붙들고 있어야 하므로 위험 신호).
    • GETTRUNCATES - TRUNCATE도 복제.
  • 주의: 롱 트랜잭션은 캐시·trail 폭증의 주범이므로 애플리케이션 배치의 커밋 주기를 점검한다.

⑧-1 Extract 등록·기동 Source

GGSCI> add exttrail ./dirdat/ea, extract EXTA, megabytes 1024
GGSCI> start EXTA
GGSCI> info all
  • 주의: trail 파일 크기(megabytes 1024)와 dirdat 디스크 용량은 트랜잭션량 기준으로 넉넉히 잡는다.

⑨ Data Pump(PMPA) 파라미터 Source

GGSCI> edit params PMPA
EXTRACT PMPA
CACHEMGR CACHESIZE 1G
PASSTHRU
RMTHOST 192.168.0.191, MGRPORT 7809
RMTTRAIL ./dirdat/ra
--SEQUENCE KING.*;
TABLE KING.*;
  • 의미: Pump는 Local Trail(ea)을 읽어 Target의 Remote Trail(ra)로 전송한다. PASSTHRU는 데이터 변환 없이 통과시켜 성능을 높인다(양쪽 구조 동일 전제). 캡처(EXTA)와 전송(PMPA)을 분리해 네트워크 장애가 캡처를 멈추지 않게 한다.
  • 주의: RMTHOST는 Target 서버 IP, MGRPORT는 Target Manager 포트. 방화벽에서 이 구간이 열려 있어야 한다.

⑨-1 Pump 등록·기동 Source

GGSCI> add extract PMPA, exttrailsource ./dirdat/ea
GGSCI> add rmttrail ./dirdat/ra, extract PMPA, megabytes 1024
GGSCI> start PMPA
GGSCI> info all

2.6 초기 데이터 이관 (Instantiation)

실시간 캡처(EXTA/PMPA)를 먼저 띄워 변경을 trail에 쌓아두고, 특정 SCN 기준으로 초기 스냅샷을 만든 뒤 그 SCN 이후부터 Replicat이 적용하도록 정합을 맞춘다. 이 SCN 기준점이 초기 이관의 핵심이다.

⑩-1 현재 SCN 추출 Source

SELECT dbms_flashback.get_system_change_number a_scn FROM dual;
--  예: 29515919   ← 이 값이 기준점

⑩-2 SCN 시점 기준 Data Pump 백업 Source

expdp system/manager0 directory=datapump dumpfile=king.dmp \
  logfile=king.log schemas=king flashback_scn=29515919
  • 의미: FLASHBACK_SCN으로 정확히 그 SCN 시점의 일관된 스냅샷을 뜬다.
  • 주의: flashback_scn 백업은 ORA-01555(snapshot too old) 확률이 높다. 큰 테이블은 백업 소요 시간을 감안해 undo_retention을 충분히 늘려둔다.

⑩-3 Target으로 import Target

impdp system/manager0 directory=datapump dumpfile=king.dmp logfile=imp_king.log

2.7 Target 준비 및 Replicat 구성

⑪ Trigger / Job 비활성화 Target

-- 트리거 비활성화 DDL을 동적 생성 후 실행
SELECT 'ALTER TRIGGER ' || owner || '.' || trigger_name || ' DISABLE;'
  FROM dba_triggers WHERE owner='KING';
-- 스케줄러 잡 정지
ALTER SYSTEM SET job_queue_processes=0 SCOPE=BOTH;
  • 의미: Replicat이 적용하는 변경은 이미 Source에서 트리거/잡이 반영된 최종 결과다. Target에서 트리거·잡이 또 돌면 이중 처리·복제 무결성 훼손이 발생하므로 비활성화한다.
  • 주의: 운영 전환 시 필요 트리거/잡을 다시 켜야 함을 잊지 말 것.

⑫ OGG DB 연결 Target

GGSCI> dblogin userid ogg, password manager0

⑬ Checkpoint Table 생성 Target

GGSCI> add checkpointtable
  • 의미: Classic(비통합) Replicat은 적용 위치를 DB 내 체크포인트 테이블에 기록해 재기동 시 정확히 재개한다.

⑭ Replicat(REPA) 파라미터 Target

GGSCI> edit params REPA
REPLICAT REPA
USERID ogg, PASSWORD manager0
CACHEMGR CACHESIZE 1G
ASSUMETARGETDEFS
BATCHSQL
HANDLECOLLISIONS
DISCARDFILE ./dirrpt/repa.dsc, APPEND, MEGABYTES 1024
GETTRUNCATES
MAP KING.*, TARGET KING.*;
  • 의미 (주요 파라미터)
    • ASSUMETARGETDEFS - Source/Target 테이블 구조가 동일하다고 가정(별도 defs 파일 불필요).
    • BATCHSQL - 유사 DML을 묶어 배치 적용해 성능 향상.
    • HANDLECOLLISIONS - 초기 이관 구간에서 이미 있는 행/없는 행에 대한 INSERT/UPDATE 충돌을 무시(missing/duplicate 허용).
    • DISCARDFILE - 적용 실패 레코드 기록.
    • MAP ... TARGET ... - Source→Target 매핑.
  • 주의: HANDLECOLLISIONS는 초기 동기화가 따라잡힌 뒤 반드시 제거한다. 계속 켜두면 실제 적용 오류(무결성 위반 등)까지 조용히 삼켜 데이터 불일치를 감춘다. ASSUMETARGETDEFS는 구조가 정확히 같을 때만 유효.

⑭-1 Replicat 등록·기동 (SCN 이후부터 적용) Target

GGSCI> add replicat REPA, exttrail ./dirdat/ra
GGSCI> start replicat REPA, aftercsn 29515919   -- 백업받은 SCN 이후부터
GGSCI> info all
  • 의미: AFTERCSN초기 스냅샷과 실시간 변경의 이음매다. 스냅샷에 이미 포함된 SCN까지는 건너뛰고 그 이후 변경만 적용해 중복/누락을 방지한다.
  • 주의: aftercsn 값은 ⑩-1에서 뽑은 SCN과 정확히 일치해야 한다.

2.8 동기화 확인 및 장애 대응 Source Target

  • 정상 구성 시 Source/Target의 동일 테이블을 각각 조회해 실시간 동기화를 확인한다.
  • 장애 시 프로세스 상태가 ABENDED로 바뀌며 중단된다. 원인은 리포트에서 확인한다.
  • GGSCI> view report REPA
  • 리포트 보기가 불편하면 $OGG_HOME/dirrpt.rpt 파일을 직접 연다.

3. 원활한 OGG 동작을 위한 추가 주의사항

3.1 DB 레벨 필수 설정 (재확인)

항목 이유 미설정 시 증상
ARCHIVELOG 모드 Extract 지연 시 archive log에서 읽어야 함 필요 로그 유실 → 캡처 단절
FORCE LOGGING NOLOGGING/direct-path 변경 누락 방지 일부 행이 조용히 복제 안 됨
최소 보충 로깅 + SCHEMATRANDATA Target에서 행 식별(PK/UI) UPDATE/DELETE 적용 실패
enable_goldengate_replication=TRUE OGG 패키지/로그리더 게이트 Extract 기동 실패

3.2 Archive Log 보존과 Extract 위치

RMAN의 DELETE ARCHIVELOG 정책이 Extract가 아직 안 읽은 로그를 지우지 않도록 보존 기간에 여유를 둔다. Extract가 며칠 지연돼도 로그가 남아 있어야 재개가 가능하다.

3.3 키·컬럼 타입 사전 점검

  • PK/UK 없는 테이블: OGG가 전 컬럼을 논리 키로 쓰거나 KEYCOLS를 지정해야 한다. 대상 목록을 미리 뽑아 방침을 정한다.
  • SELECT t.owner, t.table_name FROM dba_tables t WHERE t.owner='KING' AND NOT EXISTS (SELECT 1 FROM dba_constraints c WHERE c.owner=t.owner AND c.table_name=t.table_name AND c.constraint_type IN ('P','U'));
  • LOB/LONG 컬럼 테이블: fetch 특성·성능이 달라 별도 점검이 필요하다.

3.4 메모리·용량

  • Classic Extract 메모리: CACHEMGR CACHESIZE가 트랜잭션 캐시. 롱 트랜잭션이 많으면 여유 있게.
  • Trail 디스크: dirdat 저장 공간과 I/O 여력을 트랜잭션량 기준으로 산정. Pump가 지연되면 Local Trail이 쌓이므로 여유 필수.
  • 초기 이관: flashback_scn 백업의 ORA-01555 대비 undo_retention 상향.

3.5 무결성·루프 방지

  • HANDLECOLLISIONS는 초기 동기화 이후 제거 (3.6과 함께 운영 전환 체크리스트에 포함).
  • EXCLUDEUSER OGG로 OGG 자체 트랜잭션 캡처 제외(루프 방지).
  • Target 트리거/잡 비활성화 상태를 운영 전환 시 원복할지 결정.

3.6 대규모(예: 1,000개 테이블) 구성 시

  • 프로세스 분할: 단일 Extract/Replicat에 몰지 말고 스키마·업무 도메인 단위로 여러 그룹으로 나눈다.
  • 참조 무결성 그룹핑: 부모–자식(FK) 관계 테이블은 같은 Replicat에 묶어 적용 순서·정합성을 보장한다.
  • SCHEMATRANDATA 우선: 테이블 단위 관리는 누락 위험이 크므로 스키마 단위로 일괄 관리.
  • 성능 향상 옵션: 적용 병목 시 BATCHSQL, 그리고 아키텍처를 Parallel/Integrated Replicat으로 전환하는 것을 검토(의존성 분석 기반 병렬 적용).

3.7 모니터링

  • Heartbeat Table(ADD HEARTBEATTABLE) - end-to-end lag 측정.
  • LAGCRITICALSECONDS/LAGINFO로 임계치 경보.
  • 정기적으로 INFO ALL·.rpt·.dsc(discard) 점검.

3.8 Integrated로 전환한다면 (참고)

본 가이드는 Classic이다. Integrated Extract/Replicat로 갈 경우 추가로 필요한 항목:

  • STREAMS_POOL_SIZE ≥ (모든 Integrated Extract의 MAX_SGA_SIZE 합) × 1.25
  • Extract 등록: REGISTER EXTRACT <name> DATABASE (CDB면 CONTAINER (pdb))
  • 멀티테넌트(CDB)면 공통 사용자(c##ggadmin) + container => 'ALL' 권한
  • DBLOGREADER 대신 Integrated 캡처 엔진 사용

본 문서는 Classic Architecture(OGG 11g 계열) 기준으로 작성되었습니다. 실제 실행 전 대상 DB 버전(특히 CDB 여부)과 OGG 버전에 맞춰 파라미터·문법을 검증하시기 바랍니다.

728x90