2025년 Oracle GoldenGate 체크포인트 래그 해결 가이드

Oracle GoldenGate 체크포인트 래그 해결 가이드
Oracle GoldenGate Checkpoint Lag 해결 가이드

Oracle GoldenGate Checkpoint Lag 해결 가이드

Long Running Transaction으로 인한 실제 Production 장애 해결 사례

🔥 The Problem: When Your Checkpoint Won't Move

긴급 상황: 2025년 8월 10일, 모든 GoldenGate Extract 프로세스가 3.5시간의 Checkpoint Lag를 보이고 있었습니다.

아침에 일어나서 Oracle GoldenGate 복제가 몇 시간씩 지연되고 있는 것을 발견한 적이 있나요? 그런데 모든 것이 "정상"으로 보인다면?

최근 프로덕션 환경에서 Extract 프로세스가 3.5시간의 checkpoint lag를 보이면서도 실제 데이터 캡처(GETLAG)는 단 1초였던 이상한 문제를 해결했습니다.

GGSCI - 초기 상태 확인
-- 모든 Extract 프로세스 상태 확인
GGSCI> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt
EXTRACT     RUNNING     01CD086E    03:30:00      00:00:00
EXTRACT     RUNNING     01CS087E    03:30:00      00:00:00
EXTRACT     RUNNING     01MD088E    03:30:00      00:00:00
EXTRACT     RUNNING     01SD085E    03:30:00      00:00:00
EXTRACT     RUNNING     01SS084E    03:30:00      00:00:00

하지만 여기서 이상한 점이 있었습니다. GETLAG를 확인했을 때:

GGSCI - GETLAG 확인
GGSCI> SEND EXTRACT 01SS084E, GETLAG
Sending GETLAG request to EXTRACT 01SS084E ...
Last record lag 1 seconds.
핵심 문제: Redo 처리는 실시간(1초 지연)이지만, Checkpoint는 3.5시간 뒤처져 있었습니다.

🔍 The Investigation: Finding the Culprit

Step 1: Long Running Transaction 확인

첫 번째로 long running transaction을 확인했습니다:

SHOWTRANS 명령어
GGSCI> SEND EXTRACT 01SS084E, SHOWTRANS DURATION 240 MIN

------------------------------------------------------------
XID:         14.15.4795600
Items:       0
Extract:     01SS084E
Redo Thread: 1
Start Time:  2025-08-10:04:12:58
SCN:         1.4038799620 (8333766916)
Redo Seq:    74849
Redo RBA:    42582120
Status:      Running

4:12 AM에 시작된 트랜잭션을 발견했습니다. 이것이 우리의 범인이었습니다.

Step 2: 모든 Extract 프로세스 확인

모든 5개의 Extract 프로세스를 확인한 결과, 놀랍게도 모두 동일한 XID를 기다리고 있었습니다:

모든 Extract 확인 스크립트
GGSCI> SEND EXTRACT 01CD086E, SHOWTRANS DURATION 240 MIN
GGSCI> SEND EXTRACT 01CS087E, SHOWTRANS DURATION 240 MIN
GGSCI> SEND EXTRACT 01MD088E, SHOWTRANS DURATION 240 MIN
GGSCI> SEND EXTRACT 01SD085E, SHOWTRANS DURATION 240 MIN
GGSCI> SEND EXTRACT 01SS084E, SHOWTRANS DURATION 240 MIN
모든 프로세스가 XID 14.15.4795600을 기다리고 있었습니다. 이것이 병목 지점이었습니다.

Step 3: Database 레벨 조사

이 트랜잭션이 데이터베이스에서 실제로 활성 상태인지 확인했습니다:

SQL - v$transaction 확인
SQL> SELECT * FROM v$transaction 
WHERE xidusn=14 AND xidslot=15 AND xidsqn=4795600;

no rows selected
중요 발견: 트랜잭션이 v$transaction에 존재하지 않음 = 이미 커밋되었거나 롤백됨!

Step 4: ASH(Active Session History) 분석

v$transaction이 비어있었으므로, ASH를 통해 과거 정보를 찾았습니다:

SQL - ASH 조회
SELECT sample_time, session_id, session_serial#, sql_id, sql_opname,
       program, module, machine, event
FROM dba_hist_active_sess_history
WHERE xid = hextoraw('000E000F00492CD0')  -- XID를 RAW 형식으로 변환
AND sample_time BETWEEN 
    TO_TIMESTAMP_TZ('2025-08-10 03:45:00 +01:00','YYYY-MM-DD HH24:MI:SS TZH:TZM')
    AND TO_TIMESTAMP_TZ('2025-08-10 05:15:00 +01:00','YYYY-MM-DD HH24:MI:SS TZH:TZM')
ORDER BY sample_time;

결과: SYS 세션 (SID 1456)이 정확히 04:12:58에 로그인 - 트랜잭션 시작 시간과 완벽히 일치!

💡 The Root Cause: Index Rebuild Operations

4:12 AM 타임스탬프를 기억하시나요? 우리는 4:00 AM에 인덱스 리빌드 작업을 시작했었습니다:

SQL - 문제의 인덱스 리빌드 명령
ALTER INDEX BAPCO_MDB.CORERELATIONORIGINOIDN 
    REBUILD ONLINE NOLOGGING PARALLEL 14;
    
ALTER INDEX BAPCO_MDB.CORERELATIONORIGINTYPEN 
    REBUILD ONLINE NOLOGGING PARALLEL 14;

📌 핵심 문제점

PARALLEL 14로 실행된 리빌드 작업이 대규모 트랜잭션을 생성했고, GoldenGate의 Extract 프로세스들이 이를 기다리고 있었습니다. 리빌드는 성공적으로 완료되었지만(alert log 확인), GoldenGate의 open transaction cache는 여전히 stale boundary를 유지하고 있었습니다.

✅ The Solution: Controlled Extract Restart

Step 1: Archive Log 확인

먼저 필요한 archive log가 존재하는지 확인합니다:

SQL - Archive Log 확인
SELECT sequence#, name, first_time, next_time
FROM v$archived_log
WHERE thread# = 1 AND sequence# >= 74849
ORDER BY sequence#;

우리의 경우, 8월 5일까지의 archive가 있어서 문제없었습니다.

Step 2: Extract 강제 중지 및 재시작

Extract 프로세스를 하나씩 재시작합니다 (동시에 모두 재시작하지 마세요!):

GGSCI - Force Stop & Restart
GGSCI> SEND EXTRACT 01CD086E, FORCESTOP
Sending FORCESTOP request to EXTRACT 01CD086E ...
Request processed.

-- 10-20초 대기

GGSCI> START EXTRACT 01CD086E
Sending START request to MANAGER ('GGSMGR_S3D') ...
EXTRACT 01CD086E starting
Step 3: Recovery 진행 모니터링

재시작 후 Extract는 recovery 모드로 진입합니다:

GGSCI - Recovery 상태 확인
GGSCI> SEND EXTRACT 01CD086E, STATUS

EXTRACT 01CD086E (PID 12164)
Current status: In recovery[1]: Processing data
Current read position:
Redo thread #: 1
Sequence #: 74851
RBA: 271748752
Timestamp: 2025-08-10 04:13:26.000000
Recovery는 Extract당 약 15-20분 소요되었습니다.
Step 4: 해결 확인

Recovery 완료 후 확인:

GGSCI - 최종 확인
GGSCI> SEND EXTRACT 01CD086E, SHOWTRANS DURATION 240 MIN
No transactions found.

GGSCI> INFO EXTRACT 01CD086E
Checkpoint Lag       00:00:02 (updated 00:00:01 ago)
성공! Checkpoint lag가 3.5시간에서 단 2초로 감소했습니다.

📊 Key Monitoring Commands

이 문제를 해결하는 동안 다음 명령어들이 매우 유용했습니다:

Essential GoldenGate Commands
# Transaction 상태 확인
SEND EXTRACT <group_name>, SHOWTRANS DURATION 240 MIN

# 현재 lag 확인
SEND EXTRACT <group_name>, GETLAG

# 상세 상태 확인
SEND EXTRACT <group_name>, STATUS

# 통계 보기
STATS EXTRACT <group_name> LATEST

# Lag 정보
LAG EXTRACT <group_name>

# 상세 정보
INFO EXTRACT <group_name>, DETAIL

🛡️ Prevention Tips

이 문제를 해결한 후, 향후 재발 방지를 위해 다음과 같은 조치를 구현했습니다:

  • Off-Peak 시간에 인덱스 리빌드 수행: 트랜잭션 활동이 최소인 시간대로 유지보수 작업 이동
  • Parallel Degree 감소: PARALLEL 14 대신 PARALLEL 4-8 사용. 병렬 처리 감소로 트랜잭션 시간 단축
  • NOLOGGING 대신 LOGGING 사용: 데이터베이스 레벨에서 FORCE_LOGGING=YES여도 DDL에서 명시적으로 LOGGING 지정
  • 사전 모니터링 설정: Checkpoint lag가 30분을 초과하면서 GETLAG가 낮을 때 알림 설정
  • 파티션 레벨 작업 고려: 파티션 테이블의 경우 전체 인덱스보다 파티션 레벨에서 리빌드

💡 Pro Tip

주요 지표 패턴:
• 높은 checkpoint lag + 낮은 GETLAG (1-2초)
• 모든 Extract 프로세스가 동일한 XID 표시
• v$transaction에 XID 없음

이 패턴을 보면 Extract 프로세스의 제어된 재시작이 보통 stale transaction boundary를 해결합니다.

📥 모든 스크립트 다운로드

이 가이드에서 사용된 모든 SQL 및 GGSCI 명령어를 하나의 파일로 다운로드하세요

🎯 The Bottom Line

핵심 교훈: Oracle GoldenGate checkpoint lag가 항상 실제 복제 지연을 의미하는 것은 아닙니다. 때로는 이미 사라진 유령 트랜잭션을 기다리고 있을 뿐입니다.

기억해야 할 사항:

  • FORCESTOP 전에 항상 archive log 가용성 확인
  • Extract 프로세스를 동시에 모두 재시작하지 말고 하나씩 순차적으로 재시작
  • Recovery 진행 상황을 모니터링하고 완료까지 충분한 시간 허용
  • 문제 패턴을 문서화하여 향후 빠른 해결 도모

"성능 지연은 신호입니다. 그 안에는 반드시 해결의 실마리가 숨어 있습니다."

위로 스크롤