2026년 10월 24일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00072 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00072 process is not active 는?
ORA-00072 에러는 Oracle 데이터베이스 내부에서 특정 프로세스가 더 이상 활성 상태가 아닐 때 발생하는 에러입니다. 주로 백그라운드 프로세스나 서버 프로세스가 비정상적으로 종료되었거나, 해당 프로세스와의 통신을 시도할 때 해당 프로세스가 이미 죽어 있는 상태에서 발생합니다. 이 에러는 데이터베이스 운영 중 갑작스러운 프로세스 중단, 시스템 리소스 부족, 또는 Oracle 내부 오류로 인해 유발될 수 있으며, 방치할 경우 데이터베이스 성능 저하 및 연결 장애로 이어질 수 있습니다.
주요 발생 원인
1. 백그라운드 프로세스의 비정상 종료
Oracle의 백그라운드 프로세스(PMON, SMON, DBWn, LGWR 등) 중 하나가 OS 레벨에서 강제 종료되거나 메모리 부족으로 인해 비정상 종료된 경우 이 에러가 발생합니다. 이 경우 Oracle은 해당 프로세스에 메시지를 전달하려 하지만 프로세스가 이미 없는 상태이므로 ORA-00072를 반환합니다. 특히 kill -9 명령으로 프로세스를 강제 종료했을 때 빈번하게 발생하며, 이는 Oracle이 정상적인 정리(cleanup) 작업을 수행할 기회를 박탈하기 때문입니다.
2. 세션 또는 서버 프로세스의 좀비(Zombie) 상태
클라이언트 세션이 비정상 종료된 이후 서버 프로세스가 좀비 상태로 남아 있을 때 해당 프로세스에 접근하려는 시도에서 이 에러가 발생할 수 있습니다. 네트워크 장애, 클라이언트 측의 갑작스러운 연결 끊김, 또는 세션 타임아웃 설정 미흡으로 인해 서버 프로세스가 OS에서는 살아 있지만 Oracle 내부적으로는 활성화되지 않은 상태로 인식될 수 있습니다. 이런 좀비 프로세스들은 리소스를 점유하면서도 실제 작업을 수행하지 않아 시스템 성능에 악영향을 미칩니다.
3. 병렬 쿼리(Parallel Query) 실행 중 슬레이브 프로세스 실패
대용량 병렬 쿼리를 실행하는 도중 병렬 슬레이브 프로세스 중 하나가 메모리 부족이나 내부 오류로 갑자기 종료될 경우 코디네이터 프로세스가 ORA-00072를 반환할 수 있습니다. 특히 PGA 메모리 제한을 초과하는 대규모 정렬(Sort) 또는 해시 조인 작업 중 발생하기 쉽습니다. 이 경우 병렬 쿼리 전체가 실패하고 사용자에게 에러가 노출되므로 병렬 처리 설정과 메모리 관리를 동시에 점검해야 합니다.
해결 방법
원인 1: 백그라운드 프로세스 비정상 종료 대응
먼저 현재 활성화된 백그라운드 프로세스를 확인합니다.
-- 현재 Oracle 백그라운드 프로세스 확인
SELECT
p.spid AS os_pid,
p.pid AS oracle_pid,
p.program AS program_name,
p.background AS is_background,
p.status AS status
FROM
v$process p
WHERE
p.background = 1
ORDER BY
p.pid;
비정상 종료된 프로세스를 확인 후, alert 로그를 통해 원인을 파악합니다.
-- alert 로그 위치 확인
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
-- 최근 발생한 에러 확인 (AWR or V$ 뷰 활용)
SELECT
sid,
serial#,
status,
process,
program,
machine,
logon_time
FROM
v$session
WHERE
status != 'ACTIVE'
AND type = 'USER'
ORDER BY
logon_time DESC;
확인 결과 특정 백그라운드 프로세스가 사라진 경우, 인스턴스 재시작이 필요합니다.
-- 인스턴스 상태 확인
SELECT instance_name, status, database_status FROM v$instance;
-- 데이터베이스 재시작 (최후 수단)
-- SHUTDOWN IMMEDIATE;
-- STARTUP;
원인 2: 좀비 세션 정리
좀비 상태의 세션을 식별하고 정리합니다.
-- 비활성 세션 중 오래된 세션 확인
SELECT
s.sid,
s.serial#,
s.username,
s.status,
s.machine,
s.program,
s.last_call_et AS idle_seconds,
p.spid AS os_pid
FROM
v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE
s.status = 'INACTIVE'
AND s.last_call_et > 3600 -- 1시간 이상 비활성 세션
AND s.type = 'USER'
ORDER BY
s.last_call_et DESC;
-- 특정 좀비 세션 강제 종료 (SID, SERIAL# 확인 후 실행)
ALTER SYSTEM KILL SESSION '&SID,&SERIAL#' IMMEDIATE;
OS 레벨에서도 좀비 프로세스 정리가 필요할 수 있습니다.
-- OS PID 확인 후 서버에서 kill 명령 실행
-- (DBA 권한 + OS 접근 권한 필요)
SELECT
s.sid,
s.serial#,
p.spid AS os_pid,
s.username,
s.status
FROM
v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE
s.sid = &target_sid;
-- OS에서 실행: kill -9 <os_pid>
원인 3: 병렬 쿼리 슬레이브 프로세스 실패 대응
병렬 쿼리 관련 상태를 확인하고 적절히 조정합니다.
-- 현재 병렬 쿼리 실행 현황 확인
SELECT
qc_sid,
server_group,
server_set,
server#,
degree,
req_degree,
status
FROM
v$px_session
ORDER BY
qc_sid;
-- PGA 사용량 확인
SELECT
name,
value / 1024 / 1024 AS value_mb
FROM
v$pgastat
WHERE
name IN (
'aggregate PGA target parameter',
'aggregate PGA auto target',
'total PGA inuse',
'maximum PGA allocated'
);
-- 병렬 처리 파라미터 조정 (필요 시)
-- 병렬 슬레이브 프로세스 수 제한
ALTER SYSTEM SET parallel_max_servers = 20 SCOPE=BOTH;
-- 특정 세션에서만 병렬도 제한
ALTER SESSION SET parallel_degree_policy = MANUAL;
ALTER SESSION SET parallel_max_servers = 4;
예방 방법
1. 프로세스 모니터링 및 Dead Connection Detection 설정
Oracle에서 제공하는 SQLNET.EXPIRE_TIME 파라미터를 sqlnet.ora에 설정하여 Dead Connection을 자동으로 감지하고 정리하도록 구성합니다. 이 설정은 클라이언트 연결이 비정상 종료된 경우 서버 프로세스가 무한정 좀비 상태로 남아 있는 것을 방지합니다.
-- sqlnet.ora 설정 (DB 서버의 $ORACLE_HOME/network/admin/sqlnet.ora)
-- SQLNET.EXPIRE_TIME = 10 (10분마다 체크)
-- 현재 세션별 리소스 사용 제한 프로파일 확인
SELECT
profile,
resource_name,
limit
FROM
dba_profiles
WHERE
resource_name IN ('IDLE_TIME', 'CONNECT_TIME', 'SESSIONS_PER_USER')
AND profile IN (SELECT profile FROM dba_users WHERE account_status = 'OPEN')
ORDER BY
profile, resource_name;
-- 프로파일을 통한 유휴 세션 자동 종료 설정
CREATE PROFILE app_user_profile LIMIT
IDLE_TIME 30 -- 30분 유휴 시 자동 종료
CONNECT_TIME 480 -- 8시간 연결 제한
SESSIONS_PER_USER 10;
-- 사용자에게 프로파일 적용
-- ALTER USER app_user PROFILE app_user_profile;
2. 정기적인 V$ 뷰 기반 프로세스 헬스 체크 자동화
정기적으로 Oracle 내부 프로세스 상태를 모니터링하는 스크립트를 스케줄러나 OEM(Oracle Enterprise Manager)을 통해 자동화합니다. 이상 징후 감지 시 DBA에게 즉시 알림을 발송하는 체계를 갖추면 ORA-00072와 같은 프로세스 관련 에러를 사전에 예방할 수 있습니다.
-- 주기적으로 실행할 헬스 체크 쿼리
SELECT
TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS check_time,
COUNT(*) AS total_sessions,
SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) AS active_sessions,
SUM(CASE WHEN status = 'INACTIVE' THEN 1 ELSE 0 END) AS inactive_sessions,
SUM(CASE WHEN status = 'KILLED' THEN 1 ELSE 0 END) AS killed_sessions
FROM
v$session
WHERE
type = 'USER';
-- KILLED 상태로 오래 남아 있는 세션 감지
SELECT
sid,
serial#,
username,
status,
last_call_et AS elapsed_seconds,
machine,
program
FROM
v$session
WHERE
status = 'KILLED'
AND last_call_et > 300 -- 5분 이상 KILLED 상태 유지
ORDER BY
last_call_et DESC;
관련 에러
- ORA-00060: Deadlock detected while waiting for resource — 프로세스 간 교착 상태 발생 시 나타나며 ORA-00072와 함께 발생할 수 있습니다.
- ORA-03113: End-of-file on communication channel — 서버 프로세스가 갑자기 종료될 때 클라이언트에서 받는 에러로, ORA-00072의 클라이언트 측 대응 에러입니다.
- ORA-03114: Not connected to Oracle — 연결이 단절된 상태에서 쿼리 실행 시 발생하며, 비활성 프로세스 관련 맥락에서 함께 나타납니다.
- ORA-00447: Fatal error in background process — 백그라운드 프로세스의 치명적 오류 발생 시 나타나며 ORA-00072를 유발하는 선행 에러일 수 있습니다.
- ORA-00480: LCK process terminated with error — RAC 환경에서 Lock 프로세스 종료 시 발생하며, 역시 프로세스 비활성 상황과 연관됩니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.