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가지 설계 사상
- 논리적 복제 - 블록이 아니라 "행 변경의 의미"를 복제한다. 그래서 Target에서 행을 식별할 PK/UI 값이 반드시 필요하고, 이를 위해 보충 로깅(Supplemental Logging)이 전제된다.
- Trail 기반 디커플링 - Extract와 Replicat이 파일(trail)로 분리되어 서로의 속도차·장애를 흡수한다. Target이 잠시 내려가도 Extract는 Local Trail에 계속 쌓을 수 있다. 각 프로세스는 checkpoint로 처리 위치를 기록해, 죽었다 살아나도 정확히 재개한다.
- 커밋 순서 보존 - 캡처는 커밋 순서대로 실어 나른다. (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 all2.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 all2.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.log2.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 버전에 맞춰 파라미터·문법을 검증하시기 바랍니다.
'📁 Database > Oracle' 카테고리의 다른 글
| [Oracle] 테이블/메타데이터 RENAME 시 테이블/메타데이터 간 관계 영향도 테스트 (0) | 2026.06.16 |
|---|---|
| [Oracle] sql 파일을 활용한 19c Single Non-CDB Timezone 버전 업그레이드 가이드(42 -> 44) (0) | 2026.03.07 |
| [Oracle] Non-CDB에서 Timezone 업그레이드 방법(DSTv43 -> 44) (0) | 2026.03.07 |
| [Oracle] Oracle Instant Client rpm 설치 가이드 (for Linux x86-64) (0) | 2026.02.25 |
| [Oracle] Huge Page 설정 스크립트 링크 (0) | 2026.02.13 |
