Table of Contents
ToggleOracle GoldenGate Checkpoint Lag 해결 가이드
Long Running Transaction으로 인한 실제 Production 장애 해결 사례
🔥 The Problem: When Your Checkpoint Won't Move
아침에 일어나서 Oracle GoldenGate 복제가 몇 시간씩 지연되고 있는 것을 발견한 적이 있나요? 그런데 모든 것이 "정상"으로 보인다면?
최근 프로덕션 환경에서 Extract 프로세스가 3.5시간의 checkpoint lag를 보이면서도 실제 데이터 캡처(GETLAG)는 단 1초였던 이상한 문제를 해결했습니다.
-- 모든 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> SEND EXTRACT 01SS084E, GETLAG
Sending GETLAG request to EXTRACT 01SS084E ...
Last record lag 1 seconds.
🔍 The Investigation: Finding the Culprit
Step 1: Long Running Transaction 확인
첫 번째로 long running transaction을 확인했습니다:
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를 기다리고 있었습니다:
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
Step 3: Database 레벨 조사
이 트랜잭션이 데이터베이스에서 실제로 활성 상태인지 확인했습니다:
SQL> SELECT * FROM v$transaction
WHERE xidusn=14 AND xidslot=15 AND xidsqn=4795600;
no rows selected
Step 4: ASH(Active Session History) 분석
v$transaction이 비어있었으므로, 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에 인덱스 리빌드 작업을 시작했었습니다:
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
먼저 필요한 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가 있어서 문제없었습니다.
Extract 프로세스를 하나씩 재시작합니다 (동시에 모두 재시작하지 마세요!):
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
재시작 후 Extract는 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 완료 후 확인:
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)
📊 Key Monitoring 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
기억해야 할 사항:
- FORCESTOP 전에 항상 archive log 가용성 확인
- Extract 프로세스를 동시에 모두 재시작하지 말고 하나씩 순차적으로 재시작
- Recovery 진행 상황을 모니터링하고 완료까지 충분한 시간 허용
- 문제 패턴을 문서화하여 향후 빠른 해결 도모
"성능 지연은 신호입니다. 그 안에는 반드시 해결의 실마리가 숨어 있습니다."