리커버리 끝났는데 XID가 왜 안 사라지죠? – GoldenGate 실전 삽질기

Oracle Goldengate Recovery rev2
리커버리 끝났는데 XID가 왜 안 사라지죠? - GoldenGate 실전 삽질기
🔥 후속편

리커버리 끝났는데
XID가 왜 안 사라지죠?

Oracle GoldenGate 체크포인트 래그 실전 삽질기 2탄
feat. 3일간의 고군분투

🤔 뭐가 문제였나요?

당황스러운 상황: 분명 리커버리 완료됐다고 나오는데, SHOWTRANS 치면 아직도 그 놈의 XID가 보이는 거예요!
"아니, Recovery complete라면서요? 왜 아직도 XID 14.15.4795600이 남아있죠? 😱"

상황을 정리하자면요:

  • 1편 방법대로 Extract들 순차 재시작 완료 ✓
  • 모두 "Recovery complete: Processing data" 상태 확인 ✓
  • 근데 일부 Extract(01CD086E 같은)는 여전히 SHOWTRANS에 같은 XID가... 🤷‍♂️
  • 다음날 보니 새로운 XID(14.4.4794298)가 또 나타남!

🎭 실제 경험담

결국 38GB짜리 인덱스 2개 리빌드 때문에 전체 Extract가 따라잡는데 무려 3일이 걸렸어요. 이 경험 이후로 큰 작업할 때는 그냥 OGG 정지하고 하기로 했답니다... (현실적인 선택 🥲)

💡 알아두세요!

GETLAG(지금 얼마나 밀렸나)와 Checkpoint Lag(재시작하면 어디서부터 다시 해야 하나)는 완전히 다른 거예요! GETLAG 1초여도 체크포인트는 몇 시간 전일 수 있어요.

🔍 도대체 왜 이러는 걸까요?

현장에서 삽질하며 찾아낸 원인들이에요:

원인 1: DB는 조용한데 Extract 캐시는 아직...

DB에선 이미 커밋되어서 v$transaction에 없는데, Extract 내부 캐시는 아직 그 경계를 못 넘어간 상태예요. 새로운 트랜잭션이 들어와야 밀려나가는데, DB가 조용하면... 계속 그대로 있죠. 😴

원인 2: 줄줄이 이어지는 후속 작업들

인덱스 리빌드가 끝났다고 끝이 아니에요! DDL 작업의 recursive 활동들이 계속 이어져서 새로운 XID들이 계속 나타나요. 마치 도미노처럼... 🁃

원인 3: Integrated Extract의 특이한 표시

STATUS 찍어보면 가끔 이상하게 나와요:

  • Redo thread #: 0
  • Sequence #: 0
  • RBA: 0
  • 타임스탬프는 멈춰있고...

당황하지 마세요! Integrated 모드에선 종종 있는 일이에요. 진짜 확인은 INFO EXTRACT xxx, DETAIL로 해야 해요.

🛠️ 이럴 때 어떻게 하나요?

우리가 만든 3단계 확인 루틴 (5-10분마다 체크)

체크 1: STATUS 확인 SEND EXTRACT 그룹명, STATUS

👉 Seq/RBA/타임스탬프가 조금이라도 움직이나요?

체크 2: SHOWTRANS 확인 SEND EXTRACT 그룹명, SHOWTRANS DURATION 240 MIN

👉 똑같은 XID가 15-20분 넘게 안 바뀌나요?

체크 3: STATS 확인 STATS EXTRACT 그룹명 LATEST

👉 처리된 레코드 수가 늘어나나요?

상황별 대응법

😌 "DB가 조용해서 그래요" 신호

✓ DB 활동 거의 없음
✓ 에러 메시지 없음
✓ I/O 병목 없음
✓ 아카이브 충분함
→ 그냥 기다리세요. 건드리면 더 꼬여요!

😰 "진짜 멈춘 것 같아요" 신호

✓ 같은 XID가 15-30분 이상 완전 고정
✓ ggserr.log에 에러 없음
✓ 아카이브도 충분함
→ 해당 Extract만 조심스럽게 재시작:

조심스러운 재시작
GGSCI> SEND EXTRACT 그룹명, FORCESTOP
-- 꼭! 10-20초 기다리세요
GGSCI> START EXTRACT 그룹명
⚠️ 절대 주의사항: 동시에 리커버리하는 Extract는 3개까지만! 그리고 재시작은 무조건 하나씩!

🔬 정말 궁금하면 LogMiner로 까보세요

SHOWTRANS에 계속 나오는 그 XID, 도대체 뭘 하다가 생긴 건지 궁금하시죠? LogMiner로 직접 확인해봅시다!

1단계: 아카이브 확인
-- 해당 구간 아카이브가 있는지 먼저 확인
SELECT sequence#, name, first_time, next_time
FROM v$archived_log
WHERE thread# = 1 
  AND sequence# BETWEEN 74849 AND 74870
ORDER BY sequence#;
2단계: LogMiner 시작
BEGIN
  -- 첫 번째 아카이브 추가
  DBMS_LOGMNR.ADD_LOGFILE(
    LOGFILENAME => 'E:\ORACLE\...\첫번째아카이브.ARC', 
    OPTIONS => DBMS_LOGMNR.NEW
  );
  
  -- 나머지 아카이브들 추가
  DBMS_LOGMNR.ADD_LOGFILE(
    LOGFILENAME => 'E:\ORACLE\...\두번째아카이브.ARC', 
    OPTIONS => DBMS_LOGMNR.ADDFILE
  );
  
  -- LogMiner 시작!
  DBMS_LOGMNR.START_LOGMNR(
    OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG
  );
END;
/
3단계: 범인 찾기
-- XID로 직접 찾기 (예: 14.15.4795600)
SELECT timestamp, scn, operation, 
       seg_owner, seg_name, sql_redo
FROM   v$logmnr_contents
WHERE  xid_usn  = 14
  AND  xid_slot = 15
  AND  xid_sqn  = 4795600
ORDER BY scn;

결과 해석법

  • COMMIT이 보이면: DB에선 이미 끝난 거예요. Extract 캐시가 밀릴 때까지 기다리거나 살짝 재시작
  • COMMIT이 안 보이면: 진짜 아직 안 끝난 거예요! 어떤 작업인지 확인하고 담당자한테 연락

💼 3일간 삽질하며 배운 것들

1. 재시작은 양날의 검 ⚔️

막 재시작하지 마세요! 특히 장기 트랜잭션이 진짜 살아있을 때 재시작하면 리커버리 시간만 더 늘어나요. 아카이브 확인은 필수고, 한 번에 하나씩만!

2. 동시 리커버리는 3개가 한계

🎪 실제 경험

5개 Extract 한꺼번에 리커버리 돌렸더니 서버가 숨을 못 쉬더라고요. I/O 경쟁에 LogMiner 부하까지... 결국 3개씩 나눠서 했더니 오히려 더 빨리 끝났어요.

3. Windows 서버 특별 팁 💻

아카이브/트레일 폴더는 꼭 백신 검사에서 제외하세요! 그리고 I/O 상태 체크:

PowerShell I/O 체크
# PowerShell에서 실행
Get-Counter '\PhysicalDisk(_Total)\Avg. Disk sec/Transfer',
            '\PhysicalDisk(_Total)\Disk Reads/sec',
            '\PhysicalDisk(_Total)\Current Disk Queue Length' `
            -SampleInterval 1 -MaxSamples 60

Queue Length가 0 근처, sec/Transfer가 몇 ms 정도면 I/O는 문제없는 거예요.

4. Bounded Recovery의 함정

Bounded Recovery 켜놨다고 안심하지 마세요. 파일 깨지면 어차피 표준 리커버리로 돌아가요. 과신은 금물!

📝 인덱스 리빌드 전 체크리스트

이거 다 확인하셨나요?

새벽 시간대나 주말로 일정 잡기
PARALLEL 14는 너무해요! 4-8 정도로
LOGGING 옵션 꼭 명시 (FORCE_LOGGING 믿지 마세요)
현재 장기 트랜잭션 없는지 확인
아카이브 저장 공간 충분한지 확인
정 불안하면... OGG 정지 고려 (진짜 큰 작업이면)

🎯 결론: 이것만 기억하세요!

Recovery complete인데 XID가 남아있다?
1️⃣ 후속 작업이 계속 진행 중이거나
2️⃣ DB가 조용해서 캐시가 안 밀려나간 거예요

대부분은 시간이 해결해줘요. 조급해하지 마세요! 🧘‍♂️
"38GB 인덱스 리빌드 → Extract 전체 정상화까지 3일... 이게 현실이에요 😅"

꼭 기억할 것들

  • STATUS/SHOWTRANS/STATS 3종 세트로 판단하기
  • LogMiner로 사실 확인 후 조치하기
  • 아카이브는 넉넉하게 보관하기
  • 무리한 병렬 재시작은 독!
  • 때론 기다림이 최고의 해결책 🍵

📌 마지막 팁

1편에서 배운 기본기(패턴 파악, 순차 재시작, 예방법)는 여전히 유효해요! 거기에 이번 편의 "기다림의 미학"을 더하면 완벽! 👌

📚 자주 쓰는 명령어 모음

바로 써먹는 명령어들
-- 상태 확인 3종 세트
SEND EXTRACT 그룹명, STATUS
SEND EXTRACT 그룹명, SHOWTRANS DURATION 240 MIN
STATS EXTRACT 그룹명 LATEST

-- 지연 확인
SEND EXTRACT 그룹명, GETLAG
LAG EXTRACT 그룹명

-- 조심스러운 재시작
SEND EXTRACT 그룹명, FORCESTOP
-- 꼭 기다리세요!
START EXTRACT 그룹명

📥 실전 플레이북 다운로드

LogMiner 쿼리부터 체크리스트까지 다 들어있어요!

"3일간의 리커버리 대장정을 통해 깨달은 진리:
때로는 아무것도 안 하는 게 최선의 해결책이다."


- 27년차 오라클 전문가의 체념... 아니, 깨달음 😌

위로 스크롤