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 진행 상황을 모니터링하고 완료까지 충분한 시간 허용
  • 문제 패턴을 문서화하여 향후 빠른 해결 도모

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

위로 스크롤