ORA-00064: object is too large to allocate on this OS
30๋ ๊ฒฝ๋ ฅ Oracle DBA์ ์ค๋ฌด ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์์ฑํ ํธ๋ฌ๋ธ์ํ ๊ฐ์ด๋์ ๋๋ค.
ORA-00064๋?
ORA-00064๋ Oracle ์ธ์คํด์ค ๊ธฐ๋ ์ ๋๋ ํน์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ ์, ์ด์์ฒด์ (OS)๊ฐ ํด๋น ๊ฐ์ฒด(์ฃผ๋ก SGA ๋๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ)๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์์ ๋ ๋ฐ์ํ๋ ์๋ฌ์
๋๋ค. ์ฆ, Oracle์ด init.ora ๋๋ spfile์ ์ค์ ๋ ํ๋ผ๋ฏธํฐ ๊ฐ(์: sga_target, processes, sga_max_size ๋ฑ)์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ์์์ ์์ฒญํ์ง๋ง, OS ๋ ๋ฒจ์ ์ปค๋ ํ๋ผ๋ฏธํฐ ๋๋ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ํ๊ณ๋ก ์ธํด ํ ๋น์ด ๊ฑฐ๋ถ๋ ์ํฉ์
๋๋ค. ์ด ์๋ฌ๋ ํนํ ์๋ก์ด Oracle ์ธ์คํด์ค๋ฅผ ์ฒ์ ๊ธฐ๋ํ๊ฑฐ๋, ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ ํ ์ฌ๊ธฐ๋ ์ ์์ฃผ ์ ํ๊ฒ ๋๋ฉฐ, DBA๋ผ๋ฉด ๋ฐ๋์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์งํด์ผ ํฉ๋๋ค.
์ฃผ์ ๋ฐ์ ์์ธ
1. OS ์ปค๋์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ๋ผ๋ฏธํฐ(SHMMAX/SHMALL) ์ค์ ๋ถ์กฑ
๊ฐ์ฅ ๋น๋ฒํ ์์ธ์
๋๋ค. Linux/Unix ํ๊ฒฝ์์ Oracle SGA๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(Shared Memory Segment)๋ฅผ ์ฌ์ฉํ๋๋ฐ, OS ์ปค๋ ํ๋ผ๋ฏธํฐ์ธ SHMMAX(๋จ์ผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ ์ต๋ ํฌ๊ธฐ)๋ SHMALL(์ ์ฒด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง ํฉ๊ณ)์ด Oracle์ด ์์ฒญํ๋ SGA ํฌ๊ธฐ๋ณด๋ค ์๊ฒ ์ค์ ๋์ด ์์ ๊ฒฝ์ฐ ์ด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด sga_target=8G๋ก ์ค์ ํ๋๋ฐ SHMMAX๊ฐ 2GB๋ก ์ ํ๋์ด ์๋ค๋ฉด, OS๋ ์์ฒญ์ ๊ฑฐ๋ถํฉ๋๋ค.
2. Oracle ํ๋ผ๋ฏธํฐ ๊ฐ์ด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ(RAM)๋ฅผ ์ด๊ณผํ๊ฑฐ๋ ๊ณผ๋ํ๊ฒ ์ค์ ๋จ
sga_target, sga_max_size, memory_target, pga_aggregate_target ๋ฑ์ ํ๋ผ๋ฏธํฐ ํฉ์ฐ ๊ฐ์ด ์ค์ ์๋ฒ์ ์ฅ์ฐฉ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ณผํ๋๋ก ์๋ชป ์ค์ ๋ ๊ฒฝ์ฐ์๋ ์ด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ํนํ memory_target ๋๋ memory_max_target์ ์ฌ์ฉํ๋ AMM(Automatic Memory Management) ๊ตฌ์ฑ์์, /dev/shm(tmpfs) ํฌ๊ธฐ๊ฐ memory_target ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ Linux ํ๊ฒฝ์์ ์ด ์๋ฌ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํฉ๋๋ค.
3. processes ํ๋ผ๋ฏธํฐ ๊ณผ๋ ์ค์ ์ผ๋ก ์ธํ OS ์์ ํ๊ณ ์ด๊ณผ
processes ํ๋ผ๋ฏธํฐ๋ Oracle ์ธ์คํด์ค์ ๋์์ ์ ์ํ ์ ์๋ ์ต๋ ํ๋ก์ธ์ค ์๋ฅผ ์ ์ํ๋ฉฐ, ์ด ๊ฐ์ด ๋งค์ฐ ํฌ๊ฒ ์ค์ ๋ ๊ฒฝ์ฐ ๋ด๋ถ์ ์ผ๋ก ํ์ํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ฒด(์: ๋์น, ์ ๊ธ ๊ตฌ์กฐ ๋ฑ)์ ํฌ๊ธฐ๋ ๋น๋กํ์ฌ ์ฆ๊ฐํฉ๋๋ค. OS์ ์ต๋ ํ๋ก์ธ์ค ์ ์ ํ(kernel.pid_max, ulimit ๋ฑ)์ ์ด๊ณผํ๊ฑฐ๋, ํด๋น ๊ตฌ์กฐ์ฒด๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด OS ํ๊ณ๋ฅผ ๋์ด์ค ๋ ORA-00064๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
์์ธ 1 ํด๊ฒฐ: OS ์ปค๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ๋ผ๋ฏธํฐ ์กฐ์ (Linux ๊ธฐ์ค)
ํ์ฌ ์ปค๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ ํ์ธํ๊ณ Oracle SGA ํฌ๊ธฐ์ ๋ง๊ฒ ์กฐ์ ํฉ๋๋ค.
-- ํ์ฌ SGA ๊ด๋ จ ํ๋ผ๋ฏธํฐ ํ์ธ (Oracle ๊ธฐ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ)
SELECT name, value
FROM v$parameter
WHERE name IN ('sga_target', 'sga_max_size', 'memory_target', 'memory_max_target')
ORDER BY name;
# OS์์ ํ์ฌ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ปค๋ ํ๋ผ๋ฏธํฐ ํ์ธ
$ ipcs -lm
$ sysctl -a | grep -i shm
# /etc/sysctl.conf ์์ ์์ (SGA = 8GB ๊ธฐ์ค)
# SHMMAX: ๋จ์ผ ์ธ๊ทธ๋จผํธ ์ต๋ ํฌ๊ธฐ (bytes) - SGA๋ณด๋ค ํฌ๊ฒ ์ค์
# SHMALL: ์ ์ฒด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ด ํ์ด์ง ์ (page size = 4096 bytes ๊ธฐ์ค)
$ vi /etc/sysctl.conf
# ์๋ ๊ฐ์ ์ถ๊ฐ ๋๋ ์์ (8GB SGA ๊ธฐ์ค)
kernel.shmmax = 10737418240 # 10GB (bytes)
kernel.shmall = 2621440 # 10GB / 4096 = 2621440 pages
kernel.shmmni = 4096
# ๋ณ๊ฒฝ์ฌํญ ์ฆ์ ์ ์ฉ
$ sysctl -p
-- spfile์์ SGA ํ๋ผ๋ฏธํฐ ์กฐ์ (ํ์ ์ ์ค์ด๊ธฐ)
-- sqlplus / as sysdba ์ ์ ํ ์ํ
ALTER SYSTEM SET sga_target = 6G SCOPE=SPFILE;
ALTER SYSTEM SET sga_max_size = 6G SCOPE=SPFILE;
-- ๋ณ๊ฒฝ ํ ์ธ์คํด์ค ์ฌ๊ธฐ๋
SHUTDOWN IMMEDIATE;
STARTUP;
์์ธ 2 ํด๊ฒฐ: AMM ํ๊ฒฝ์์ /dev/shm ํฌ๊ธฐ ์กฐ์ ๋ฐ ํ๋ผ๋ฏธํฐ ์์
# /dev/shm ํ์ฌ ํฌ๊ธฐ ํ์ธ
$ df -h /dev/shm
# /dev/shm ํฌ๊ธฐ๋ฅผ memory_target ์ด์์ผ๋ก ์กฐ์ (์: 12GB)
$ mount -o remount,size=12G /dev/shm
# ์๊ตฌ ์ ์ฉ์ ์ํด /etc/fstab ์์
$ vi /etc/fstab
# ์๋ ๋ผ์ธ ์ถ๊ฐ ๋๋ ์์
tmpfs /dev/shm tmpfs defaults,size=12G 0 0
-- AMM ๋นํ์ฑํ ํ ASMM์ผ๋ก ์ ํ (๊ถ์ฅ)
-- AMM(memory_target) ๋์ ASMM(sga_target + pga_aggregate_target) ์ฌ์ฉ
-- pfile ์์ฑ ํ ์ง์ ํธ์ง
CREATE PFILE='/tmp/init_fix.ora' FROM SPFILE;
-- ์๋ํฐ๋ก /tmp/init_fix.ora ์ด์ด ์๋์ ๊ฐ์ด ์์
-- memory_target=0
-- memory_max_target=0
-- sga_target=6G
-- pga_aggregate_target=2G
-- ์์ ๋ pfile๋ก ๊ธฐ๋
STARTUP PFILE='/tmp/init_fix.ora';
-- ์ ์ ๊ธฐ๋ ํ์ธ ํ spfile ์ฌ์์ฑ
CREATE SPFILE FROM PFILE='/tmp/init_fix.ora';
-- AMM ์์ ๋นํ์ฑํ ํ์ธ
SELECT name, value
FROM v$parameter
WHERE name IN ('memory_target','memory_max_target','sga_target','pga_aggregate_target');
์์ธ 3 ํด๊ฒฐ: processes ํ๋ผ๋ฏธํฐ ์ ์ ๊ฐ ์กฐ์
-- ํ์ฌ processes ์ค์ ๋ฐ ์ค์ ์ฌ์ฉ ํํฉ ํ์ธ
SELECT name, value
FROM v$parameter
WHERE name = 'processes';
-- ํ์ฌ ์ค์ ์ ์ ํ๋ก์ธ์ค ์ ํ์ธ
SELECT COUNT(*) AS current_processes
FROM v$process;
-- ์ต๋ ๋์ ์ธ์
์ด๋ ฅ ํ์ธ (AWR ์ฌ์ฉ ๊ฐ๋ฅ ์)
SELECT snap_id,
instance_number,
num_lcpus,
MAX(num_cpus) AS max_cpus
FROM dba_hist_osstat
GROUP BY snap_id, instance_number, num_lcpus;
-- ์ ์ ์์ค์ผ๋ก processes ํ๋ผ๋ฏธํฐ ์กฐ์ ์์
-- ์ผ๋ฐ์ ์ผ๋ก (์ต๋ ๋์ ์ธ์
์ * 1.2) + ์ฌ์ ๋ถ ์ผ๋ก ์ค์
ALTER SYSTEM SET processes = 500 SCOPE=SPFILE;
-- OS ulimit ํ์ธ ๋ฐ ์กฐ์ (oracle ๊ณ์ ๊ธฐ์ค)
-- /etc/security/limits.conf ์ค์ ์์
# oracle ๊ณ์ ulimit ํ์ธ
$ su - oracle
$ ulimit -a | grep -E "open files|max user processes"
# /etc/security/limits.conf ์์
$ vi /etc/security/limits.conf
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft nofile 65536
oracle hard nofile 65536
# ์ ์ฉ ํ์ธ (์ฌ๋ก๊ทธ์ธ ํ)
$ ulimit -u
์๋ฐฉ ๋ฐฉ๋ฒ
1. Oracle ์ค์น ์ /ํ OS ์ปค๋ ํ๋ผ๋ฏธํฐ ์ฌ์ ๊ฒ์ฆ ์๋ํ
Oracle ๊ณต์ ๊ถ๊ณ ์(Oracle Database Installation Guide)์ ๋ช
์๋ ์ปค๋ ํ๋ผ๋ฏธํฐ ์ต์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก, ์ธ์คํด์ค ๊ธฐ๋ ์ ์ฌ์ ๊ฒ์ฆ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ฌ ์ด์ ํ์ค์ผ๋ก ์ฑํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ ์คํฌ๋ฆฝํธ๋ฅผ cron ๋๋ Ansible playbook์ ํตํฉํ๋ฉด, ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ ํ ์ฌ๊ธฐ๋ ์ ๋ฐ์ํ ์ ์๋ ์ฅ์ ๋ฅผ ์ฌ์ ์ ์ฐจ๋จํ ์ ์์ต๋๋ค.
#!/bin/bash
# Oracle SGA/์ปค๋ ํ๋ผ๋ฏธํฐ ์ฌ์ ๊ฒ์ฆ ์คํฌ๋ฆฝํธ
SGA_TARGET_GB=8 # ์ค์ ์์ SGA (GB)
SGA_BYTES=$((SGA_TARGET_GB * 1024 * 1024 * 1024))
PAGE_SIZE=$(getconf PAGE_SIZE)
SHMMAX=$(sysctl -n kernel.shmmax)
SHMALL=$(sysctl -n kernel.shmall)
SHMALL_BYTES=$((SHMALL * PAGE_SIZE))
SHM_DEV=$(df /dev/shm | awk 'NR==2{print $2}') # KB ๋จ์
echo "=== Oracle ๋ฉ๋ชจ๋ฆฌ ํ๋ผ๋ฏธํฐ ๊ฒ์ฆ ==="
echo "๋ชฉํ SGA ํฌ๊ธฐ : ${SGA_TARGET_GB}GB (${SGA_BYTES} bytes)"
echo "ํ์ฌ SHMMAX : ${SHMMAX} bytes"
echo "ํ์ฌ SHMALL : ${SHMALL_BYTES} bytes"
echo "/dev/shm ํฌ๊ธฐ : $((SHM_DEV / 1024 / 1024))GB"
if [ "$SHMMAX" -lt "$SGA_BYTES" ]; then
echo "[WARNING] SHMMAX๊ฐ SGA ํฌ๊ธฐ๋ณด๋ค ์์ต๋๋ค. ์กฐ์ ํ์!"
else
echo "[OK] SHMMAX ์ค์ ์ ์"
fi
if [ "$SHMALL_BYTES" -lt "$SGA_BYTES" ]; then
echo "[WARNING] SHMALL์ด SGA ํฌ๊ธฐ๋ณด๋ค ์์ต๋๋ค. ์กฐ์ ํ์!"
else
echo "[OK] SHMALL ์ค์ ์ ์"
fi
-- Oracle ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ ์ด๋ ฅ ๊ด๋ฆฌ ์ฟผ๋ฆฌ (๋ณ๊ฒฝ ์ ํ ๋น๊ต์ฉ)
SELECT name,
value AS current_value,
default_value,
description
FROM v$parameter
WHERE name IN (
'sga_target', 'sga_max_size',
'pga_aggregate_target',
'memory_target', 'memory_max_target',
'processes', 'sessions'
)
ORDER BY name;
2. ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ ์ ๋ฐ๋์ SCOPE=SPFILE ๋จ๊ณ์ ์ ์ฉ ๋ฐ ๋ณ๊ฒฝ ๊ด๋ฆฌ ํ๋ก์ธ์ค ์๋ฆฝ
์ด์ ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณ๊ฒฝํ ๋๋ ๋ฐ๋์ pfile์ ์ฌ์ ์ ๋ฐฑ์
ํ๊ณ , SCOPE=SPFILE๋ก ๋ณ๊ฒฝํ ๋ค ์ฌ๊ธฐ๋ ์ ์ OS ์ค์ ๊ณผ์ ์ ํฉ์ฑ์ ๋ค์ ํ๋ฒ ๊ฒํ ํ๋ ์ ์ฐจ๋ฅผ ๋ณ๊ฒฝ ๊ด๋ฆฌ ํ๋ก์ธ์ค๋ก ๋ฌธ์ํํด์ผ ํฉ๋๋ค. ํนํ ํด๋ผ์ฐ๋(OCI, AWS RDS ์ ์ธ EC2 ์์ฒด ์ค์น ๋ฑ) ๋๋ ๊ฐ์ํ ํ๊ฒฝ์์๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น ๊ฐ๋ฅ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ์ฐจ์ด๊ฐ ์กด์ฌํ ์ ์์ผ๋ฏ๋ก, free -h, vmstat, ipcs -m ๋ช
๋ น์ด๋ฅผ ํตํ ์ค์๊ฐ ๋ฉ๋ชจ๋ฆฌ ํํฉ ๋ชจ๋ํฐ๋ง์ ์ฌ๊ธฐ๋ ์ ํ์ ์ฒดํฌ๋ฆฌ์คํธ๋ก ํฌํจ์ํค๋ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค.
-- ๋ณ๊ฒฝ ์ ํ์ฌ spfile ๋ด์ฉ ๋ฐฑ์
CREATE PFILE='/backup/oracle/pfile_backup_YYYYMMDD.ora' FROM SPFILE;
-- ๋ณ๊ฒฝ ํ ๊ฒ์ฆ์ ์ํ ํ๋ผ๋ฏธํฐ ํ์ธ
SELECT name, value, ismodified, description
FROM v$parameter
WHERE ismodified != 'FALSE'
ORDER BY name;
๊ด๋ จ ์๋ฌ
| ์๋ฌ ์ฝ๋ | ์ค๋ช |
|---|---|
| ORA-27102 |
out of memory - OS๊ฐ ์์ฒญ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์์ ๋ ๋ฐ์. ORA-00064์ ํจ๊ป alert log์ ์ฐ๋ฌ์ ๋ํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ |
| ORA-27123 |
unable to attach to shared memory segment - ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ์ ์ฐ๊ฒฐ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํ ๋ ๋ฐ์. SHM |












