DEV Community

umzzil nng
umzzil nng

Posted on • Originally published at oraerror.com

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

ORA-00064 object is too large to allocate on this OS 는?

ORA-00064 에러는 Oracle이 특정 객체(주로 SGA 또는 메모리 관련 구조체)를 운영체제(OS) 레벨에서 할당하려 할 때, OS가 허용하는 최대 크기를 초과하여 할당이 불가능할 때 발생합니다. 주로 초기화 파라미터(init.ora 또는 spfile)에서 PROCESSES, SESSIONS, TRANSACTIONS 등의 값이 OS의 커널 파라미터 한계를 초과하도록 설정되었을 때 데이터베이스 시작(startup) 단계에서 발생하는 경우가 많습니다. 이 에러는 대부분 데이터베이스가 아예 올라오지 않는 상황을 만들기 때문에, 신속하고 정확한 원인 파악과 조치가 매우 중요합니다.


주요 발생 원인

1. PROCESSES 또는 SESSIONS 파라미터가 OS 커널 한계를 초과한 경우

Oracle의 PROCESSES 파라미터는 동시에 접속할 수 있는 OS 프로세스 수를 결정하며, 이 값이 OS 커널의 최대 프로세스 수(kernel.pid_max 또는 nproc 등)를 초과하면 ORA-00064가 발생합니다. 특히 Linux/Unix 환경에서 DBA가 성능 향상을 위해 PROCESSES 값을 급격히 올렸을 때, OS 커널 파라미터를 함께 조정하지 않으면 반드시 이 에러를 마주치게 됩니다. SESSIONS 파라미터는 기본적으로 PROCESSES * 1.1 + 5로 자동 계산되므로, PROCESSES 값을 올리면 SESSIONS도 연쇄적으로 증가한다는 점을 항상 인지해야 합니다.

2. SGA 크기가 OS의 공유 메모리 세그먼트 한계를 초과한 경우

SGA_MAX_SIZE, SGA_TARGET, MEMORY_MAX_TARGET 등의 파라미터를 통해 SGA를 크게 설정하면, OS의 공유 메모리(Shared Memory) 관련 커널 파라미터인 shmmax(단일 공유 메모리 세그먼트 최대 크기) 또는 shmall(전체 공유 메모리 최대 페이지 수) 한계에 걸려 에러가 발생할 수 있습니다. 예를 들어 Linux에서 shmmax 값이 2GB로 설정되어 있는데 SGA를 4GB로 지정하면, Oracle은 단일 공유 메모리 세그먼트로 SGA를 할당하지 못하고 ORA-00064와 함께 인스턴스 시작에 실패합니다.

3. 32비트 OS 또는 32비트 Oracle에서 메모리 주소 공간 한계 초과

32비트 환경에서는 단일 프로세스가 사용할 수 있는 가상 주소 공간이 최대 4GB(실제로는 OS 영역 제외 시 2~3GB 수준)로 제한됩니다. 이 한계 내에서 SGA, PGA, 코드 영역 등 모든 메모리를 할당해야 하므로, 32비트 Oracle 환경에서 무리하게 메모리 파라미터를 크게 잡으면 ORA-00064가 발생합니다. 현재 대부분의 운영 환경이 64비트로 전환되었지만, 레거시 시스템이나 특수 목적 시스템에서는 여전히 이 문제가 발생할 수 있으므로 주의가 필요합니다.


해결 방법

원인 1: PROCESSES / SESSIONS 파라미터 조정

먼저 현재 설정값을 확인하고, OS 커널 파라미터와 비교합니다.

-- 현재 PROCESSES, SESSIONS, TRANSACTIONS 파라미터 확인
SHOW PARAMETER PROCESSES;
SHOW PARAMETER SESSIONS;
SHOW PARAMETER TRANSACTIONS;

-- 또는 V$PARAMETER 뷰를 통해 확인
SELECT NAME, VALUE, DESCRIPTION
FROM   V$PARAMETER
WHERE  NAME IN ('processes', 'sessions', 'transactions')
ORDER BY NAME;
Enter fullscreen mode Exit fullscreen mode

DB가 올라와 있지 않다면, PFILE로 기동하여 값을 수정해야 합니다. SPFILE에서 PFILE을 생성한 후 수동으로 편집합니다.

-- (DB가 올라온 상태라면) SPFILE에서 PFILE 생성
CREATE PFILE='/tmp/init_backup.ora' FROM SPFILE;
Enter fullscreen mode Exit fullscreen mode

생성된 /tmp/init_backup.ora 파일을 OS 레벨에서 열어 값을 수정합니다.

# Linux/Unix OS 레벨에서 편집
vi /tmp/init_backup.ora

# 아래와 같이 적절한 값으로 수정 (예: 300 → 150)
# processes=150
# sessions=165  (또는 주석 처리하여 자동 계산 유도)
Enter fullscreen mode Exit fullscreen mode

수정한 PFILE로 DB를 기동한 후, 정상 확인되면 SPFILE을 재생성합니다.

-- 수정된 PFILE로 DB 기동
STARTUP PFILE='/tmp/init_backup.ora';

-- 정상 기동 확인 후 SPFILE 재생성
CREATE SPFILE FROM PFILE='/tmp/init_backup.ora';

-- SPFILE로 재기동
SHUTDOWN IMMEDIATE;
STARTUP;
Enter fullscreen mode Exit fullscreen mode

OS 커널 파라미터도 함께 조정해야 합니다 (Linux 기준).

# /etc/sysctl.conf 확인 및 수정
cat /etc/sysctl.conf | grep -i nproc

# 최대 프로세스 수 확인
ulimit -u

# /etc/security/limits.conf 에서 oracle 계정 nproc 한계 조정
# oracle   soft   nproc   16384
# oracle   hard   nproc   16384

# 적용
sysctl -p
Enter fullscreen mode Exit fullscreen mode

원인 2: SGA 관련 OS 공유 메모리 파라미터 조정

현재 SGA 설정값과 OS 공유 메모리 파라미터를 먼저 비교합니다.

-- SGA 관련 파라미터 확인
SELECT NAME, VALUE/1024/1024 AS "VALUE(MB)"
FROM   V$PARAMETER
WHERE  NAME IN ('sga_max_size', 'sga_target', 'memory_max_target',
                'memory_target', 'shared_pool_size', 'db_cache_size')
ORDER BY NAME;

-- 현재 SGA 실제 사용량 확인
SELECT POOL, NAME, BYTES/1024/1024 AS "SIZE(MB)"
FROM   V$SGASTAT
ORDER BY POOL, BYTES DESC;
Enter fullscreen mode Exit fullscreen mode

OS 레벨에서 shmmax, shmall 값을 확인하고 조정합니다.

# 현재 공유 메모리 커널 파라미터 확인
cat /proc/sys/kernel/shmmax
cat /proc/sys/kernel/shmall
ipcs -lm

# shmmax를 SGA 크기보다 크게 설정 (예: 8GB SGA라면 8GB 이상으로)
# /etc/sysctl.conf 수정
echo "kernel.shmmax = 8589934592" >> /etc/sysctl.conf   # 8GB
echo "kernel.shmall = 2097152"   >> /etc/sysctl.conf   # 8GB / 4096(page size)

# 적용
sysctl -p

# 확인
sysctl -a | grep shm
Enter fullscreen mode Exit fullscreen mode

SGA 파라미터를 OS 한계에 맞게 줄이는 방법도 병행합니다.

-- SPFILE에서 직접 SGA 파라미터 줄이기 (DB 재기동 필요)
ALTER SYSTEM SET SGA_TARGET=4G SCOPE=SPFILE;
ALTER SYSTEM SET SGA_MAX_SIZE=4G SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET=6G SCOPE=SPFILE;

-- 변경 후 재기동
SHUTDOWN IMMEDIATE;
STARTUP;

-- 변경 결과 확인
SELECT NAME, VALUE
FROM   V$PARAMETER
WHERE  NAME IN ('sga_target', 'sga_max_size', 'memory_max_target');
Enter fullscreen mode Exit fullscreen mode

원인 3: 32비트 환경에서의 조치

32비트 Oracle 환경에서는 SGA 크기를 물리 메모리의 절반 이하, 반드시 1.5GB 이하로 유지하는 것이 권장됩니다.

-- Oracle 버전 및 비트수 확인
SELECT BANNER FROM V$VERSION;

-- 32비트 환경에서 권장 SGA 설정 예시
ALTER SYSTEM SET SGA_MAX_SIZE=1G SCOPE=SPFILE;
ALTER SYSTEM SET SGA_TARGET=1G SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=512M SCOPE=SPFILE;

-- 변경 내용 확인
SELECT NAME, VALUE/1024/1024 AS "MB"
FROM   V$PARAMETER
WHERE  NAME IN ('sga_max_size', 'sga_target', 'pga_aggregate_target');
Enter fullscreen mode Exit fullscreen mode

예방 방법

1. OS 커널 파라미터와 Oracle 파라미터를 연계한 정기 점검 체계 수립

Oracle 파라미터를 변경하기 전에 반드시 OS 커널 파라미터와의 정합성을 먼저 확인하는 체크리스트를 운영 절차에 포함시키는 것이 중요합니다. 아래 쿼리를 정기 점검 스크립트에 포함시켜 현재 설정값을 지속적으로 모니터링하고, PROCESSES 값이 OS nproc 한계의 80%를 넘지 않도록 임계치를 설정하여 알람을 받도록 구성하세요.

-- 정기 점검용: 주요 파라미터 현황 조회
SELECT NAME,
       VALUE,
       DESCRIPTION,
       ISDEFAULT,
       ISMODIFIED
FROM   V$PARAMETER
WHERE  NAME IN ('processes', 'sessions', 'transactions',
                'sga_max_size', 'sga_target',
                'memory_max_target', 'memory_target')
ORDER BY NAME;
Enter fullscreen mode Exit fullscreen mode

2. 파라미터 변경 전 반드시 PFILE 백업 및 테스트 환경 사전 검증

운영 DB에서 메모리/프로세스 관련 파라미터를 변경하기 전에는 반드시 현재 SPFILE을 PFILE로 백업해 두고, 가능하다면 테스트 환경에서 동일한 OS 커널 파라미터 조건 하에 먼저 검증한 후 운영에 적용하는 것이 원칙입니다. 특히 SCOPE=SPFILE로 변경한 후 DB를 재기동했을 때 에러가 발생하면, 백업해둔 PFILE로 즉시 복구할 수 있어야 합니다.

-- 파라미터 변경 전 PFILE 백업 (날짜 포함하여 이력 관리)
CREATE PFILE='/oracle/backup/initORCL_20240115.ora' FROM SPFILE;

-- 백업된 PFILE 내용 확인 (OS 레벨)
-- cat /oracle/backup/initORCL_20240115.ora
Enter fullscreen mode Exit fullscreen mode

관련 에러

  • ORA-00063: maximum number of log files exceeded — 리두 로그 파일 수 한계 초과로 발생하며, 리소스 한계 관련 에러군에 속합니다.
  • ORA-04031: unable to allocate N bytes of shared memory — SGA 내 공유 풀(Shared Pool) 메모리 부족 시 발생하며, ORA-00064와 함께 메모리 관련 에러로 자주 쌍으로 언급됩니다.
  • ORA-27102: out of memory — OS 레벨에서 메모리 할당 자체가 실패했을 때 발생하며, ORA-00064와 유사한 상황에서 함께 나타나는 경우가 많습니다.
  • ORA-00600: internal error code — ORA-00064 해결 과정에서 불완전한 파라미터 조합이나 메모리 부족이 내부 에러를 유발할 수 있으므로, alert log를 함께 면밀히 확인해야 합니다.

Top comments (0)