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

ORA-00028
2026년 10월 22일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-00028 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-00028 your session has been killed 는?

ORA-00028 에러는 Oracle 데이터베이스에서 현재 사용자의 세션이 DBA 또는 권한 있는 사용자에 의해 강제로 종료(kill)되었을 때 발생하는 에러입니다. 사용자가 다음 SQL 명령을 실행하려는 순간, 이미 세션이 종료된 상태임을 Oracle이 감지하고 이 메시지를 반환합니다. 일반적으로 장시간 실행되는 쿼리, 잠금(Lock) 경합, 또는 시스템 자원 과다 점유로 인해 DBA가 해당 세션을 강제 종료할 때 빈번하게 발생합니다.


주요 발생 원인

1. DBA에 의한 강제 세션 종료 (ALTER SYSTEM KILL SESSION)

가장 일반적인 원인으로, DBA가 ALTER SYSTEM KILL SESSION 명령을 통해 특정 세션을 강제로 종료한 경우입니다. 장시간 실행 중인 쿼리, 데드락(Deadlock) 상황, 또는 과도한 리소스를 소비하는 세션을 운영 관점에서 정리할 때 사용됩니다. 세션이 kill된 이후 해당 세션에서 추가 SQL을 실행하면 ORA-00028이 반환됩니다.

2. 네트워크 장애 또는 타임아웃으로 인한 세션 비정상 종료

클라이언트와 서버 간의 네트워크 연결이 불안정하거나 갑작스럽게 끊어질 경우, Oracle의 Dead Connection Detection(DCD) 또는 sqlnet.ora의 SQLNET.EXPIRE_TIME 설정에 의해 세션이 비정상 종료로 판정되어 kill될 수 있습니다. 이후 해당 세션이 복구를 시도하거나 재사용될 때 ORA-00028이 발생할 수 있습니다. 특히 커넥션 풀(Connection Pool) 환경에서 자주 관찰됩니다.

3. 프로파일(Profile) 또는 리소스 제한 초과

Oracle의 사용자 프로파일(Profile)에 설정된 IDLE_TIME, CONNECT_TIME, CPU_PER_SESSION 등의 리소스 제한을 초과할 경우 Oracle이 자동으로 해당 세션을 종료합니다. 특히 유휴 세션(Idle Session)이 오랜 시간 연결을 유지하고 있을 때 IDLE_TIME 제한에 걸려 세션이 종료되는 경우가 실무에서 매우 흔합니다. 애플리케이션이 이를 인지하지 못하고 해당 세션으로 SQL을 실행하면 ORA-00028이 발생합니다.


해결 방법

원인 1: DBA에 의한 강제 세션 종료 대응

먼저 현재 실행 중인 세션 목록과 상태를 확인합니다.

-- 현재 세션 상태 확인
SELECT sid, serial#, username, status, machine, program, sql_id, last_call_et
FROM v$session
WHERE username IS NOT NULL
ORDER BY last_call_et DESC;

-- Kill된 세션 확인 (STATUS = 'KILLED')
SELECT sid, serial#, username, status, seconds_in_wait
FROM v$session
WHERE status = 'KILLED';

세션이 kill된 상태라면 애플리케이션에서 새로운 커넥션을 맺어야 합니다. DBA 입장에서는 아래와 같이 세션을 안전하게 종료합니다.

-- 특정 세션 종료 (일반 Kill)
ALTER SYSTEM KILL SESSION 'sid,serial#';

-- 즉시 강제 종료 (IMMEDIATE 옵션)
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

-- OS 프로세스까지 즉시 종료 (DISCONNECT SESSION)
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION;

> 팁: KILL SESSION은 Oracle 내부적으로 종료 마킹만 하고 실제 정리는 지연될 수 있습니다. 빠른 정리가 필요하다면 IMMEDIATE 또는 DISCONNECT SESSION을 사용하세요.


원인 2: 네트워크 장애로 인한 세션 종료 대응

sqlnet.ora 설정을 통해 Dead Connection을 빠르게 감지하도록 설정합니다.

-- sqlnet.ora 파일에 아래 설정 추가
-- SQLNET.EXPIRE_TIME = 10  (10분 단위로 연결 상태 확인)

-- 현재 DCD 관련 파라미터 확인
SELECT name, value
FROM v$parameter
WHERE name IN ('sqlnet.expire_time');

-- 좀비(Zombie) 세션 정리를 위한 조회
SELECT sid, serial#, username, status, machine, last_call_et
FROM v$session
WHERE status = 'INACTIVE'
  AND last_call_et > 3600  -- 1시간 이상 비활성 세션
  AND username IS NOT NULL;

애플리케이션 레벨에서는 커넥션 유효성 검사(Connection Validation)를 반드시 구현해야 합니다.

-- 커넥션 풀에서 세션 유효성 테스트용 쿼리 (Test On Borrow)
SELECT 1 FROM DUAL;

원인 3: 프로파일 리소스 제한 초과 대응

현재 사용자에게 적용된 프로파일과 리소스 제한을 확인합니다.

-- 사용자의 프로파일 확인
SELECT username, profile
FROM dba_users
WHERE username = 'YOUR_USERNAME';

-- 프로파일 리소스 제한 상세 조회
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE profile = 'YOUR_PROFILE'
ORDER BY resource_name;

-- 프로파일 리소스 제한 수정 (IDLE_TIME 예시)
ALTER PROFILE your_profile LIMIT
  IDLE_TIME 60          -- 60분 유휴 시 세션 종료
  CONNECT_TIME 480      -- 최대 연결 시간 480분
  CPU_PER_SESSION UNLIMITED;

-- 특정 사용자 프로파일 변경
ALTER USER your_username PROFILE new_profile;

예방 방법

1. 커넥션 풀 및 애플리케이션의 세션 유효성 검사 구현

애플리케이션에서 사용하는 커넥션 풀(HikariCP, UCP, c3p0 등)에 반드시 testOnBorrow 또는 connectionTestQuery 옵션을 설정하여 세션 사용 전 유효성을 확인하도록 구성해야 합니다. Oracle Universal Connection Pool(UCP)의 경우 setValidateConnectionOnBorrow(true) 옵션을 활성화하면 ORA-00028과 같은 세션 관련 에러를 사전에 차단할 수 있습니다. 또한 세션 종료 후 재연결(Reconnect) 로직을 애플리케이션 레벨에서 구현하는 것이 좋습니다.

2. 적절한 프로파일 정책 수립 및 모니터링 자동화

운영 환경에 맞는 Oracle 사용자 프로파일을 사전에 설계하고, 개발/운영/배치 계정을 분리하여 각각 다른 리소스 제한을 적용해야 합니다. V$SESSION을 주기적으로 모니터링하는 스크립트나 Oracle Enterprise Manager(OEM) Alert를 통해 장시간 실행 세션이나 비정상 세션을 조기에 감지하고 대응할 수 있도록 자동화 체계를 갖추는 것이 실무에서 매우 중요합니다.


관련 에러

  • ORA-00031: session marked for kill — 세션이 kill 대상으로 마킹되었으나 아직 완전히 종료되지 않은 상태. ORA-00028의 전단계로 볼 수 있습니다.
  • ORA-03113: end-of-file on communication channel — 네트워크 연결이 갑자기 끊어졌을 때 발생하며, 세션 kill과 유사한 상황에서 나타납니다.
  • ORA-03114: not connected to ORACLE — Oracle 서버와의 연결이 완전히 끊어진 상태로, ORA-00028 이후 재접속 없이 SQL 실행 시 발생할 수 있습니다.
  • ORA-02396: exceeded maximum idle time, please connect again — 프로파일의 IDLE_TIME 초과로 세션이 종료된 직후 사용자에게 표시되는 에러로, ORA-00028과 밀접하게 연관됩니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기