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

GoldenGate Lag — 체크포인트 · 트랜잭션 진단 주제를 표현한 개념 그림
Oracle GoldenGate Checkpoint Lag 해결 가이드
Oracle GoldenGate Checkpoint Lag 해결 가이드

2025년 8월 운영 사례: 체크포인트 지연과 Extract 처리 지연을 구분해 조사한 과정

문제 상황: 체크포인트 지연과 GETLAG의 차이

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

Extract가 RUNNING이어도 지연 수치가 크게 보일 수 있습니다. 이때는 프로세스 상태뿐 아니라 각 지표가 무엇을 측정하는지 먼저 구분해야 합니다.

아래는 2025년 8월 장애 기록에 남긴 조사와 재기동 사례입니다. 당시 체크포인트 지연은 3.5시간, 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.
핵심 문제: GETLAG는 마지막 레코드의 소스 시각과 Extract 처리 시각 차이를 보여 줍니다. 체크포인트 기반 지표와 측정 기준이 다르며, GETLAG 1초만으로 전체 redo 처리나 타깃 반영이 실시간이라고 판정할 수는 없습니다.

조사 과정: XID와 데이터베이스 기록 대조

Step 1: Long Running Transaction 확인

먼저 SHOWTRANS의 장기 트랜잭션 필터로 Extract가 추적 중인 XID를 확인했습니다:

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

표시된 Start Time은 GoldenGate가 해당 트랜잭션에서 처음 추출한 작업의 시각이며, 실제 트랜잭션 시작 시각은 아닙니다. 04:12:58과 XID를 조사 단서로 삼되 원인으로 단정하지 않았습니다.

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

당시 기록에서는 다섯 Extract의 SHOWTRANS 결과에 같은 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: 데이터베이스 활성 트랜잭션 확인

같은 XID가 조회 시점의 활성 트랜잭션 목록에 있는지 대조했습니다:

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

no rows selected
중요 발견: 해당 조회에서는 일치하는 활성 트랜잭션이 나오지 않았습니다. 커밋·롤백 시점이 입증된 것은 아니므로 RAC 인스턴스, 컨테이너, 조회 시각과 XID 조건을 함께 확인해야 합니다.

Step 4: ASH(Active Session History) 분석

일치하는 활성 트랜잭션이 없어 ASH 표본을 대조했습니다. 아래 SQL의 RAW XID와 시간대 조건은 실제 기록에 맞는지 별도로 확인해야 하며, 소수점 구분 XID 문자열을 그대로 이어 붙인 값이라고 가정하면 안 됩니다:

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이 남아 있습니다. ASH의 SAMPLE_TIME은 로그인 시각이 아닌 표본 수집 시각입니다. SID만으로 동일 세션을 확정하지 말고 serial#, 인스턴스, SQL_ID와 XID를 대조해야 합니다. 시간대가 없는 SAMPLE_TIME과 시간대가 지정된 조회 조건의 해석도 확인해야 합니다.

원인 가설: 인덱스 리빌드와 시간대의 연관성

장애 기록에는 같은 날 04:00에 다음 인덱스 리빌드를 시작했다고 적혀 있습니다. SHOWTRANS와 ASH의 시각을 작업 기록과 대조할 단서로 사용했습니다:

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

원인 해석의 한계

당시에는 리빌드 작업과 Extract가 추적하는 오래된 트랜잭션 경계의 연관성을 의심했습니다. 기록에는 alert log에서 리빌드 완료를 확인했다고 남아 있지만, 이것만으로 내부 캐시의 stale boundary나 리빌드의 단독 원인이 입증되지는 않습니다. 원인 확정에는 같은 시점의 Extract 보고서, redo 위치와 DB 작업 기록이 필요합니다.

당시 대응: 조건을 확인한 뒤 Extract 순차 재기동

Step 1: Archive Log 확인 ▼

재기동을 검토하기 전에 복구에 필요한 redo 위치와 로그 가용성을 확인합니다. 아래 예시는 thread 1과 sequence 74849 이후만 조회하므로 다른 RAC thread나 incarnation까지 확인하는 완전한 점검은 아닙니다:

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일까지의 아카이브 로그를 보유했다고 적혀 있습니다. 보유 날짜만으로 충분하다고 판단하지 말고, 실제 복구 시작 위치부터 필요한 로그가 연속적으로 존재하며 읽을 수 있는지 확인해야 합니다.

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

아래는 당시 수행한 강제 중지와 재시작 기록입니다. FORCESTOP은 즉시 중지하므로 정상 중지 가능 여부와 복구·다운스트림 영향을 먼저 검토해야 합니다. 승인된 운영 절차에서 한 프로세스씩 진행하며, 예시의 10–20초를 보편적인 안전 대기 시간으로 사용하지 마세요:

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
당시 기록의 복구 소요 시간은 Extract당 약 15–20분입니다. 로그 양과 처리 조건에 따라 달라지므로 완료 기한으로 간주하지 마세요.
Step 4: 해결 확인 ▼

복구 뒤 같은 필터와 체크포인트 지표를 다시 확인했습니다. DURATION 240 MIN의 빈 결과는 240분 초과 조건에 해당하는 트랜잭션이 없다는 뜻이며, 모든 열린 트랜잭션이 사라졌다는 뜻은 아닙니다:

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)
성공! 당시 기록에서는 체크포인트 지연이 3.5시간에서 2초로 줄었습니다. 타깃 반영의 정상화는 Replicat 상태, backlog와 실제 데이터 또는 heartbeat 등으로 별도 확인해야 합니다.

상태별로 구분해 사용할 모니터링 명령

다음은 당시 사용한 조회 명령입니다. SHOWTRANS의 기간 필터, GETLAG의 레코드 지연과 STATUS의 복구 상태를 구분해 해석하세요. 적용 구문과 지원 범위는 설치된 GoldenGate 버전·Extract 방식에 맞춰 확인해야 합니다:

GoldenGate 상태 조회 명령
# 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

유지보수 계획과 사전 점검

당시 정리한 재발 방지 항목입니다. 현재 설정으로 확인된 값이나 모든 환경에 적용할 권장값은 아니며, 작업 조건에 맞게 검토해야 합니다:

  • 업무 부하가 낮은 시간에 유지보수: 복제 지연, 배치 일정과 복구 여유를 함께 고려해 작업 시간 선정
  • 병렬도 측정과 조정: PARALLEL 4–8은 당시 검토한 예시 범위입니다. 병렬도를 낮추면 자원 경쟁은 줄어들 수 있지만 작업 시간은 늘어날 수도 있으므로 부하와 소요 시간을 측정해 결정
  • 로깅 정책 확인: 유효한 FORCE LOGGING은 NOLOGGING보다 우선합니다. DDL의 LOGGING 표기와 별개로 실제 DB·테이블스페이스의 정책 및 복구·복제 요구사항 확인
  • 사전 모니터링 설정: 30분은 예시 임계값입니다. 서비스 허용 지연에 맞춰 기준을 정하고 체크포인트 지연, GETLAG와 타깃 반영 상태를 함께 관찰
  • 파티션 레벨 작업 고려: local/global 인덱스 구조와 지원 구문을 확인한 뒤 작업 범위·영향을 줄일 수 있는지 검토

재기동 전에 확인할 판단 근거

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

이 조합은 추가 조사의 출발점입니다. 자동 재기동 조건으로 쓰지 말고 조회 범위, 로그 가용성, Extract 보고서와 복구 절차를 확인한 뒤 대응을 결정하세요.

📥 모든 스크립트 다운로드

당시 SQL·GGSCI 예제를 모은 파일입니다. 다운로드한 명령을 그대로 실행하지 말고 버전, XID, 시간대와 복구 조건을 검토하세요.

정리: 관측 지표와 원인 판단을 분리하기

핵심 교훈: 체크포인트 지연과 마지막 레코드 처리 지연은 같은 지표가 아닙니다. 차이가 크면 추적 중인 XID와 복구 위치를 조사하되, 낮은 GETLAG나 활성 트랜잭션 조회의 빈 결과만으로 원인과 타깃 정상화를 단정하지 마세요.

기억해야 할 사항:

  • 강제 중지 전 정상 중지 가능 여부, 필요한 redo와 복구 절차 확인
  • 재기동이 승인된 경우 한 프로세스씩 상태와 영향을 확인하며 진행
  • 복구 위치의 진행과 타깃 반영 상태를 구분해 확인
  • 지표·XID·로그 위치와 조치 결과를 기록해 다음 조사에 활용

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

위로 스크롤