DEV Community

umzzil nng
umzzil nng

Posted on • Originally published at oraerror.com

ORA-00072 오류 원인과 해결 방법 완벽 가이드

ORA-00072란?

ORA-00072 에러는 "process is not active"라는 메시지와 함께 발생하며, Oracle이 특정 프로세스에 접근하거나 해당 프로세스와 통신을 시도할 때 그 프로세스가 이미 종료되었거나 비활성 상태임을 감지할 때 발생합니다. 주로 DBA가 ALTER SYSTEM KILL SESSION 명령을 실행하거나, 백그라운드 프로세스 상태를 조회하는 과정에서 대상 프로세스가 이미 사라진 경우에 이 에러를 마주치게 됩니다. 실무에서는 비정상 종료된 세션 처리, RAC 환경에서의 노드 간 프로세스 통신 실패, 또는 장시간 대기 중이던 프로세스가 OS 레벨에서 강제 종료된 직후에 빈번히 발생합니다.


주요 발생 원인

1. 이미 종료된 세션에 대한 KILL SESSION 시도

가장 흔한 원인으로, DBA가 V$SESSION 뷰를 조회하여 세션 정보를 확인한 후 ALTER SYSTEM KILL SESSION 명령을 실행하는 사이에 해당 세션이 자연적으로 종료되는 경우 발생합니다. 특히 오래된 쿼리를 통해 세션 정보를 조회한 뒤 시간이 지나 명령을 실행할 때 자주 발생하므로, 명령 실행 직전에 세션 상태를 반드시 재확인해야 합니다.

2. OS 레벨에서 강제 종료된 Oracle 프로세스

운영체제 관리자가 kill -9 명령으로 Oracle 서버 프로세스(Shadow Process)를 강제 종료했을 때, Oracle 인스턴스는 해당 프로세스가 사라졌음을 즉시 인지하지 못하고 내부적으로 통신을 시도하다가 이 에러를 발생시킵니다. PMON(Process Monitor) 백그라운드 프로세스가 죽은 프로세스를 정리하기 전까지 짧은 시간 동안 V$PROCESSV$SESSION에 좀비 세션으로 남아 있어 DBA를 혼란스럽게 만들 수 있습니다.

3. RAC(Real Application Clusters) 환경에서의 인터-노드 통신 실패

RAC 환경에서는 서로 다른 노드의 프로세스 간 통신이 빈번하게 발생하는데, 한 노드가 네트워크 단절이나 노드 장애로 인해 응답하지 못할 경우 상대 노드에서 ORA-00072 에러가 발생할 수 있습니다. 이는 단순한 세션 에러로 그치지 않고 클러스터 전체의 안정성에 영향을 줄 수 있기 때문에, RAC 환경에서는 Interconnect 네트워크 상태 모니터링이 특히 중요합니다.


해결 방법

원인 1: 이미 종료된 세션 KILL SESSION 시도

먼저 세션이 실제로 활성 상태인지 확인합니다.

-- 현재 활성 세션 목록 확인 (STATUS = 'ACTIVE' 또는 'INACTIVE')
SELECT s.sid,
       s.serial#,
       s.username,
       s.status,
       s.machine,
       s.program,
       s.last_call_et AS elapsed_seconds,
       p.spid          AS os_pid
FROM   v$session s
JOIN   v$process p ON p.addr = s.paddr
WHERE  s.username IS NOT NULL
  AND  s.type     = 'USER'
ORDER BY s.last_call_et DESC;
Enter fullscreen mode Exit fullscreen mode

세션이 KILLED 상태로 남아 있는 경우를 확인합니다.

-- KILLED 상태로 남아있는 세션 조회
SELECT sid,
       serial#,
       username,
       status,
       last_call_et
FROM   v$session
WHERE  status = 'KILLED';
Enter fullscreen mode Exit fullscreen mode

세션이 존재하고 아직 ACTIVE/INACTIVE 상태라면 즉시 종료합니다.

-- 정상적인 세션 종료 (권장)
ALTER SYSTEM KILL SESSION '&sid,&serial#' IMMEDIATE;

-- 세션이 응답하지 않을 경우 DISCONNECT SESSION 사용
ALTER SYSTEM DISCONNECT SESSION '&sid,&serial#' POST_TRANSACTION;

-- 즉시 강제 종료
ALTER SYSTEM DISCONNECT SESSION '&sid,&serial#' IMMEDIATE;
Enter fullscreen mode Exit fullscreen mode

세션 종료 후 KILLED 상태가 지속된다면 OS 레벨에서 직접 처리합니다.

-- OS PID 확인
SELECT p.spid,
       s.sid,
       s.serial#,
       s.username,
       s.status
FROM   v$process p
JOIN   v$session s ON s.paddr = p.addr
WHERE  s.status = 'KILLED';
Enter fullscreen mode Exit fullscreen mode
# Linux/Unix 환경에서 OS 프로세스 확인 및 종료
ps -ef | grep <spid>

# Oracle 권장: kill -9 대신 정상 종료 시도 후 필요 시 강제 종료
kill -15 <spid>
# 위 명령이 효과 없을 경우
kill -9 <spid>
Enter fullscreen mode Exit fullscreen mode

원인 2: PMON 정리 전 좀비 프로세스 처리

PMON이 자동으로 정리할 때까지 잠시 대기하거나, 아래 쿼리로 실제 OS 프로세스 존재 여부를 먼저 확인합니다.

-- V$PROCESS와 실제 OS PID 비교를 위한 상세 조회
SELECT p.pid,
       p.spid,
       p.program,
       p.background,
       s.sid,
       s.serial#,
       s.status    AS session_status,
       s.username
FROM   v$process p
LEFT JOIN v$session s ON s.paddr = p.addr
WHERE  p.spid IS NOT NULL
ORDER BY p.pid;
Enter fullscreen mode Exit fullscreen mode
-- PMON 프로세스 정상 동작 여부 확인
SELECT name, description
FROM   v$bgprocess
WHERE  name = 'PMON'
  AND  paddr <> '00';
Enter fullscreen mode Exit fullscreen mode
-- 인스턴스 전체 프로세스 현황 요약
SELECT status,
       COUNT(*) AS cnt
FROM   v$session
GROUP  BY status
ORDER  BY cnt DESC;
Enter fullscreen mode Exit fullscreen mode

원인 3: RAC 환경 인터-노드 통신 장애

-- RAC 환경 노드 상태 확인
SELECT inst_id,
       instance_name,
       host_name,
       status,
       active_state
FROM   gv$instance
ORDER BY inst_id;
Enter fullscreen mode Exit fullscreen mode
-- 각 노드별 활성 세션 수 비교 (비정상 노드 탐지)
SELECT inst_id,
       COUNT(*) AS active_sessions
FROM   gv$session
WHERE  type = 'USER'
  AND  status = 'ACTIVE'
GROUP  BY inst_id
ORDER  BY inst_id;
Enter fullscreen mode Exit fullscreen mode
-- RAC Interconnect 관련 통계 확인
SELECT name,
       value
FROM   gv$sysstat
WHERE  name LIKE '%gc%'
  AND  inst_id = 1  -- 조회할 노드 번호로 변경
ORDER BY name;
Enter fullscreen mode Exit fullscreen mode
-- 글로벌 세션 정보에서 KILLED 상태 세션 전체 노드 조회
SELECT inst_id,
       sid,
       serial#,
       username,
       status,
       machine
FROM   gv$session
WHERE  status = 'KILLED'
ORDER BY inst_id, sid;
Enter fullscreen mode Exit fullscreen mode

예방 방법

1. 세션 종료 전 상태 검증 자동화 스크립트 운영

수동으로 세션을 종료할 때 발생하는 실수를 줄이기 위해, 아래와 같이 세션 상태를 먼저 확인하고 조건부로 종료하는 표준 스크립트를 팀 내 공통 절차로 정착시키는 것이 중요합니다. 특히 배치 작업이나 정기 점검 시 스크립트화된 절차를 따르면 ORA-00072와 같은 불필요한 에러 발생을 사전에 차단할 수 있습니다.

-- 안전한 세션 종료 표준 스크립트 (세션 존재 확인 후 종료)
DECLARE
    v_count NUMBER;
    v_sid   NUMBER := &target_sid;
    v_ser   NUMBER := &target_serial;
BEGIN
    SELECT COUNT(*)
    INTO   v_count
    FROM   v$session
    WHERE  sid     = v_sid
      AND  serial# = v_ser
      AND  status  NOT IN ('KILLED');

    IF v_count > 0 THEN
        EXECUTE IMMEDIATE
            'ALTER SYSTEM KILL SESSION ''' || v_sid || ',' || v_ser || ''' IMMEDIATE';
        DBMS_OUTPUT.PUT_LINE('세션 종료 완료: SID=' || v_sid || ', SERIAL#=' || v_ser);
    ELSE
        DBMS_OUTPUT.PUT_LINE('대상 세션이 이미 종료되었거나 존재하지 않습니다.');
    END IF;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('에러 발생: ' || SQLERRM);
END;
/
Enter fullscreen mode Exit fullscreen mode

2. 장기 실행 세션 및 유휴 세션 자동 관리를 위한 Profile 설정

DBA가 수동으로 세션을 종료하는 상황 자체를 줄이려면, Oracle Profile을 활용하여 유휴 세션과 장기 실행 세션을 자동으로 관리하는 정책을 수립해야 합니다. IDLE_TIMECONNECT_TIME 파라미터를 업무 특성에 맞게 설정하면 좀비 세션 누적을 예방하고, 결과적으로 ORA-00072 발생 빈도를 크게 낮출 수 있습니다.

-- 유휴 세션 자동 관리를 위한 Profile 생성
CREATE PROFILE app_user_profile LIMIT
    IDLE_TIME          30     -- 30분 유휴 시 자동 종료 (분 단위)
    CONNECT_TIME        480   -- 최대 8시간 연결 허용 (분 단위)
    SESSIONS_PER_USER   10    -- 사용자당 최대 세션 수 제한
    FAILED_LOGIN_ATTEMPTS 5;

-- 특정 사용자에게 Profile 적용
ALTER USER app_user PROFILE app_user_profile;

-- Profile 적용 현황 확인
SELECT username,
       profile,
       account_status
FROM   dba_users
WHERE  username = 'APP_USER';

-- 현재 Profile 파라미터 상세 확인
SELECT profile,
       resource_name,
       limit
FROM   dba_profiles
WHERE  profile        = 'APP_USER_PROFILE'
  AND  resource_name IN ('IDLE_TIME', 'CONNECT_TIME', 'SESSIONS_PER_USER')
ORDER BY resource_name;
Enter fullscreen mode Exit fullscreen mode

관련 에러

  • ORA-00031: session marked for killALTER SYSTEM KILL SESSION 실행 후 세션이 즉시 종료되지 않고 KILLED 상태로 마킹될 때 발생하며, ORA-00072와 함께 연속으로 나타나는 경우가 많습니다.
  • ORA-00055: maximum number of DML locks exceeded — 프로세스 관련 리소스 한계 초과 에러로, 비정상 프로세스 누적 시 함께 발생할 수 있습니다.
  • ORA-03113: end-of-file on communication channel — 서버 프로세스가 예기치 않게 종료될 때 클라이언트 측에서 발생하며, OS 레벨 강제 종료 직후 ORA-00072와 거의 동시에 나타납니다.
  • ORA-03114: not connected to ORACLE — 세션이 강제 종료된 후 클라이언트가 계속 통신을 시도할 때 발생하며, ORA-00072와 밀접하게 연관됩니다.
  • ORA-00060: deadlock detected while waiting for resource — 교착 상태로 인해 Oracle이 세션을 강제 롤백한 직후, 해당 세션 프로세스 상태가 불안정해지면서 ORA-00072로 이어지는 경우가 있습니다.

Top comments (0)