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

ORA-00445
2026년 06월 11일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-00445 background process did not start after wait 는?

ORA-00445 에러는 Oracle 데이터베이스가 시작(startup)되는 과정에서 필수적인 백그라운드 프로세스(Background Process)가 지정된 대기 시간 내에 정상적으로 기동되지 않았을 때 발생하는 에러입니다. Oracle은 인스턴스를 시작할 때 PMON, SMON, DBWR, LGWR, CKPT 등 다양한 백그라운드 프로세스를 순차적으로 기동시키는데, 이 중 하나라도 제때 시작되지 않으면 해당 에러가 발생하고 인스턴스 기동이 실패하게 됩니다. 일반적으로 운영 환경에서 갑작스러운 리소스 부족, OS 커널 파라미터 미설정, 또는 Oracle 바이너리 손상 등의 이유로 발생하며, 즉각적인 원인 분석과 조치가 필요한 심각한 에러입니다.


주요 발생 원인

1. OS 커널 파라미터 부족 (Shared Memory / Semaphore 설정 오류)

Oracle 백그라운드 프로세스들은 IPC(Inter-Process Communication) 자원인 공유 메모리(Shared Memory)와 세마포어(Semaphore)를 사용하여 서로 통신합니다. OS의 커널 파라미터인 shmmax, shmall, sem 등이 Oracle의 요구 수준보다 낮게 설정되어 있으면 백그라운드 프로세스가 필요한 자원을 확보하지 못해 기동에 실패하고 ORA-00445 에러가 발생합니다. 특히 Linux/Unix 환경에서 /etc/sysctl.conf 설정이 Oracle 권장 값보다 낮을 경우 흔하게 나타나는 문제입니다.

2. OS 레벨 리소스 고갈 (메모리 부족 / 프로세스 한도 초과)

서버의 물리적 메모리(RAM) 또는 스왑(Swap) 공간이 부족한 상태에서 Oracle 인스턴스를 기동하면, SGA(System Global Area) 또는 PGA(Program Global Area) 할당에 실패하거나 새로운 프로세스를 fork하지 못해 백그라운드 프로세스가 기동되지 않습니다. 또한 OS의 최대 프로세스 수(ulimit -u) 제한이 낮거나, 현재 실행 중인 프로세스가 너무 많아 새 프로세스 생성이 불가능한 경우에도 동일한 증상이 발생합니다. 이런 상황은 여러 Oracle 인스턴스를 하나의 서버에서 운영하는 환경에서 자주 발생합니다.

3. Oracle 초기화 파라미터 오류 또는 바이너리 손상

PROCESSES, SESSIONS, SGA_MAX_SIZE 등 Oracle 초기화 파라미터(init.ora 또는 spfile)가 잘못 설정된 경우 백그라운드 프로세스 기동에 실패할 수 있습니다. 예를 들어 PROCESSES 값이 너무 크게 설정되어 OS 한도를 초과하거나, 반대로 너무 작아 필요한 프로세스 수를 수용하지 못하는 경우가 해당됩니다. 또한 패치 실패, 파일 시스템 손상 등으로 Oracle 바이너리 파일 자체가 손상된 경우에도 이 에러가 발생할 수 있으며, alert 로그와 trace 파일을 반드시 확인해야 합니다.


해결 방법

1단계: Alert 로그 및 Trace 파일 즉시 확인

ORA-00445 발생 시 가장 먼저 해야 할 일은 alert 로그와 백그라운드 프로세스 trace 파일을 확인하여 정확히 어떤 프로세스가 기동에 실패했는지 파악하는 것입니다.

-- Alert 로그 위치 확인 (Oracle 11g 이상)
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace';

-- Alert 로그 위치 확인 (구버전)
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'background_dump_dest';

Linux 셸에서 직접 확인하는 방법:

-- 최근 alert 로그 내용 확인 (OS 명령어이나 참고용으로 포함)
-- tail -500 $ORACLE_BASE/diag/rdbms/<dbname>/<SID>/trace/alert_<SID>.log

2단계: OS 커널 파라미터 점검 및 수정

-- 현재 SGA 크기 확인
SELECT NAME, VALUE / (1024*1024) AS "SIZE_MB"
FROM V$SGA;

-- 현재 PROCESSES 파라미터 확인
SELECT NAME, VALUE
FROM V$PARAMETER
WHERE NAME IN ('processes', 'sessions', 'sga_max_size', 'sga_target', 'pga_aggregate_target');

Linux /etc/sysctl.conf 권장 설정 예시 (SGA 8GB 기준):

-- Oracle 권장 커널 파라미터를 적용한 후 DB 기동 확인
-- sysctl.conf 설정 후 아래 명령으로 Oracle 재기동
STARTUP NOMOUNT;
ALTER DATABASE MOUNT;
ALTER DATABASE OPEN;

3단계: OS 리소스 상태 확인 및 파라미터 조정

-- 현재 인스턴스의 프로세스 수 확인
SELECT COUNT(*) AS CURRENT_PROCESSES
FROM V$PROCESS;

-- 최대 프로세스 파라미터 조회
SELECT NAME, VALUE, DESCRIPTION
FROM V$PARAMETER
WHERE NAME = 'processes';

-- PROCESSES 파라미터 수정 (spfile 사용 시)
ALTER SYSTEM SET PROCESSES = 500 SCOPE = SPFILE;

-- 수정 후 재기동 필요
SHUTDOWN IMMEDIATE;
STARTUP;

4단계: SGA 및 메모리 파라미터 재조정

-- SGA_TARGET 값 확인 및 수정
SELECT NAME, VALUE
FROM V$PARAMETER
WHERE NAME IN ('sga_target', 'sga_max_size', 'memory_target', 'memory_max_target');

-- 물리 메모리 범위 내로 SGA 조정 (예: 4GB로 축소)
ALTER SYSTEM SET SGA_TARGET = 4G SCOPE = SPFILE;
ALTER SYSTEM SET SGA_MAX_SIZE = 4G SCOPE = SPFILE;

-- 변경사항 확인
SELECT NAME, VALUE / (1024*1024*1024) AS "SIZE_GB"
FROM V$PARAMETER
WHERE NAME IN ('sga_target', 'sga_max_size');

5단계: PFILE을 이용한 최소 구성으로 기동 테스트

SPFILE이 손상되었거나 파라미터 오류가 의심될 경우:

-- 현재 SPFILE에서 PFILE 생성
CREATE PFILE = '/tmp/init_test.ora' FROM SPFILE;

-- 최소 파라미터로 PFILE 수정 후 기동 테스트
STARTUP PFILE = '/tmp/init_test.ora';

-- 기동 성공 시 SPFILE 재생성
CREATE SPFILE FROM PFILE = '/tmp/init_test.ora';

6단계: Oracle 바이너리 무결성 확인

-- Oracle Home 경로 확인
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'oracle_home';

-- 설치된 패치 목록 확인 (DBA_REGISTRY_SQLPATCH - 12c 이상)
SELECT PATCH_ID, PATCH_UID, VERSION, STATUS, DESCRIPTION
FROM DBA_REGISTRY_SQLPATCH
ORDER BY ACTION_TIME DESC;

-- 컴포넌트 상태 확인
SELECT COMP_NAME, STATUS, VERSION
FROM DBA_REGISTRY
ORDER BY COMP_NAME;

예방 방법

1. Oracle 설치 전 OS 커널 파라미터 사전 검증 및 정기 모니터링

Oracle 설치 전 반드시 Oracle 공식 설치 가이드(Oracle Installation Guide)에 명시된 커널 파라미터 최솟값을 확인하고 적용해야 합니다. 설치 후에도 아래와 같은 모니터링 쿼리를 주기적으로 실행하여 리소스 사용 추세를 파악하고, 임계치에 근접하기 전에 사전 조치를 취하는 것이 중요합니다.

-- 프로세스 사용률 모니터링 (80% 이상이면 경고)
SELECT NAME, VALUE AS MAX_VALUE,
       (SELECT COUNT(*) FROM V$PROCESS) AS CURRENT_VALUE,
       ROUND((SELECT COUNT(*) FROM V$PROCESS) / VALUE * 100, 2) AS USE_PCT
FROM V$PARAMETER
WHERE NAME = 'processes';

-- SGA 구성 요소별 사용 현황 모니터링
SELECT POOL, NAME, BYTES / (1024*1024) AS "SIZE_MB"
FROM V$SGASTAT
WHERE POOL IS NOT NULL
ORDER BY BYTES DESC;

2. 정기적인 DB Startup/Shutdown 테스트 및 Runbook 문서화

운영 환경에서는 계획된 유지보수(Planned Maintenance) 기간에 정기적으로 인스턴스 재기동 테스트를 수행하여 잠재적인 기동 문제를 사전에 발견해야 합니다. 또한 ORA-00445를 포함한 기동 장애 대응 절차를 Runbook으로 문서화해두면, 장애 발생 시 빠른 대응이 가능합니다. 아래 쿼리로 인스턴스 시작 시간과 가동 시간을 주기적으로 기록해두는 것을 권장합니다.

-- 인스턴스 기동 시간 및 가동 시간 확인
SELECT INSTANCE_NAME,
       HOST_NAME,
       STARTUP_TIME,
       ROUND((SYSDATE - STARTUP_TIME) * 24, 2) AS UPTIME_HOURS,
       STATUS
FROM V$INSTANCE;

관련 에러

  • ORA-00444: background process did not start — ORA-00445와 유사하며, 백그라운드 프로세스 자체가 시작되지 않은 경우 선행하여 발생하는 에러입니다.
  • ORA-27102: out of memory — OS 메모리 부족으로 SGA 할당에 실패했을 때 발생하며, ORA-00445와 함께 나타나는 경우가 많습니다.
  • ORA-00821: Specified value of sga_target is too small — SGA 파라미터 설정이 부적절할 때 발생하며 간접적으로 ORA-00445를 유발할 수 있습니다.
  • ORA-04031: unable to allocate bytes of shared memory — 공유 메모리 부족 시 발생하며, 커널 파라미터 문제와 연관됩니다.
  • ORA-00600: internal error code — 바이너리 손상이나 심각한 내부 오류 상황에서 ORA-00445와 함께 발생할 수 있으며, Oracle Support 케이스 오픈이 필요한 수준의 에러입니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기