Oracle 19c에서 화면이나 배치가 멈췄다면, 기다리는 세션부터 종료하지 말고 V$SESSION의 블로킹 정보로 대기 체인을 먼저 확인해야 합니다. BLOCKING_SESSION_STATUS = 'VALID'인 행이 직접 블로커를 가리키며, 여러 단계의 대기라면 FINAL_BLOCKING_SESSION이 끝단 후보를 보여 줍니다.
이 글은 Oracle Database 19c 단일 인스턴스와 RAC를 대상으로 합니다. ALTER SYSTEM KILL SESSION은 마지막 수단입니다. 활성 트랜잭션은 롤백되고, 네트워크 I/O나 롤백 중인 세션은 바로 끊기지 않을 수 있으므로 업무 소유자와 영향을 확인한 뒤 실행합니다.
적용 조건과 영향 범위
| 항목 | 적용·확인 내용 | 운영 영향 또는 예외 |
|---|---|---|
| 대기 체인 | V$SESSION의 직접·최종 블로커 열을 함께 조회합니다. |
상태가 VALID일 때만 SID를 조치 후보로 사용합니다. |
| 락 근거 | V$LOCK에서 보유 모드와 요청 모드를 대조합니다. |
RAC의 BLOCK=2는 원격 인스턴스 가능성을 뜻합니다. |
| 세션 종료 | SID와 SERIAL#를 증적과 함께 확인한 뒤 수행합니다. | 미커밋 작업은 롤백되며, 종료가 지연될 수 있습니다. |
먼저 대기 체인을 좁힌다
V$SESSION의 블로킹 열은 세션 대기를 따라가며 계산됩니다. 직접 블로커와 최종 블로커를 분리해 보면, 단순히 가장 오래 기다린 세션이 아니라 실제로 해소해야 할 세션을 찾기 쉬워집니다.
진단 SQL
목적: 현재 대기 중인 사용자 세션과 직접·최종 블로커를 한 번에 확인합니다. 적용: Oracle 19c. 권한: 일반적으로 V$SESSION 조회 권한이 필요합니다. 예상 결과: 블로커 정보가 확정된 행은 두 상태 열이 VALID로 표시됩니다.
SELECT s.sid,
s.serial#,
s.username,
s.status,
s.event,
s.seconds_in_wait,
s.blocking_instance,
s.blocking_session,
s.final_blocking_instance,
s.final_blocking_session
FROM v$session s
WHERE s.type = 'USER'
AND s.blocking_session_status = 'VALID'
ORDER BY s.seconds_in_wait DESC;
RAC에서는 같은 열을 GV$SESSION에서 조회하고 INST_ID를 함께 보관합니다. 최종 블로커가 다른 인스턴스에 있을 수 있으므로, 로컬 SID만으로 종료 명령을 만들면 안 됩니다.
락과 업무 대상을 함께 확인한다
세션 대기 정보만으로는 어떤 락이 걸렸는지 충분하지 않을 때가 있습니다. 아래 조회는 요청 중인 락과 이미 보유한 락을 분리해서 봅니다. REQUEST > 0은 획득을 기다리는 쪽이고, LMODE > 0은 보유 중인 쪽입니다.
작업 전 확인표
| 순서 | 확인 | 조치 기준 |
|---|---|---|
| 1 | 직접·최종 블로커의 SID, SERIAL#, 인스턴스 | 상태가 VALID가 아니면 종료하지 않습니다. |
| 2 | 사용자, 프로그램, 모듈, 대기 시간 | 업무 소유자에게 트랜잭션 지속 여부를 확인합니다. |
| 3 | V$LOCK의 TYPE, LMODE, REQUEST | 대기 관계와 맞지 않으면 원인을 다시 조사합니다. |
SELECT l.sid,
l.type,
l.id1,
l.id2,
l.lmode,
l.request,
l.ctime,
l.block
FROM v$lock l
WHERE l.lmode > 0
OR l.request > 0
ORDER BY l.type, l.id1, l.id2, l.request DESC;
목적: 락 보유·요청 관계를 보조 증적으로 확인합니다. 적용: Oracle 19c. 권한: 일반적으로 V$LOCK 조회 권한이 필요합니다. 예상 결과: 보유 락은 LMODE, 대기 락은 REQUEST에 0보다 큰 값이 나타납니다. 숫자 6은 배타 모드이며, 숫자만 보고 위험도를 단정하지 말고 세션·업무 정보를 함께 판단합니다.
종료는 증적을 남긴 뒤 마지막에 한다
세션 종료는 롤백을 일으킬 수 있습니다. 배치·결제·재처리 작업은 중복 실행 위험도 있으므로, 종료 전 SID·SERIAL#·인스턴스·업무 소유자·대기 근거를 기록합니다.
목적: 검토가 끝난 특정 세션을 종료합니다. 적용: Oracle 19c 단일 인스턴스. 권한: ALTER SYSTEM 권한이 필요합니다. 예상 결과: 세션이 종료되면 활성 트랜잭션은 롤백되고, 보유한 리소스가 해제됩니다.
ALTER SYSTEM KILL SESSION '123,45678';
RAC에서는 GV$SESSION.INST_ID로 인스턴스를 확인한 뒤 해당 인스턴스 정보를 포함한 구문을 사용합니다. 네트워크 I/O 또는 롤백 중인 활성 세션은 즉시 끝나지 않을 수 있으며, Oracle은 일정 시간 뒤 세션을 종료 대상으로 표시할 수 있습니다. 종료 명령을 반복해서 보내지 말고 V$SESSION 상태와 대기 체인을 다시 조회합니다.
실행 후 검증과 롤백 경계
세션 종료 자체를 복구 절차로 오해하면 안 됩니다. 종료된 세션의 미커밋 변경은 Oracle이 롤백하며, 애플리케이션 차원의 재시도·중복 요청·후속 배치 상태는 별도로 점검해야 합니다.
SELECT s.sid,
s.serial#,
s.status,
s.event,
s.blocking_session_status,
s.final_blocking_session_status
FROM v$session s
WHERE s.type = 'USER'
AND s.blocking_session_status = 'VALID'
ORDER BY s.seconds_in_wait DESC;
목적: 조치 뒤에도 블로킹 대기가 남았는지 확인합니다. 적용: Oracle 19c. 권한: V$SESSION 조회 권한이 필요합니다. 예상 결과: 해소된 대기 체인은 결과에서 사라지거나 블로킹 상태가 더 이상 VALID가 아닙니다. 남아 있다면 다음 체인의 최종 블로커와 락 근거를 새로 수집합니다.
자주 하는 실수
- 가장 오래 대기한 세션을 먼저 종료한다. 대기자는 피해자일 수 있습니다.
- SID만 기록하고 SERIAL#를 생략한다. SID는 재사용될 수 있으므로 종료 직전 두 값을 다시 확인해야 합니다.
- RAC에서 인스턴스를 생략한다.
GV$SESSION의INST_ID를 함께 확인합니다. - 세션 종료 뒤 업무 재시도만 하고 롤백·중복 처리 여부를 확인하지 않는다.
마무리
블로킹 장애의 첫 조치는 종료가 아니라 체인 확인입니다. V$SESSION으로 직접·최종 블로커를 찾고, V$LOCK으로 락 관계를 확인한 뒤, 업무 영향과 롤백을 감당할 수 있을 때만 세션을 종료합니다.