현상
trace.log 파일에 아래와 같은 메시지와 함께 쿼리 수행에 실패합니다.
•
로그상 1.7MB를 할당을 받기위한 시도를 하나, 연속된 1.7MB 의 Shared Pool(이하 SHP) 공간 부족으로 수행에 실패하거나 에러가 발생합니다.
THROW. ec=ERROR_OUT_OF_SHP(-3002) [ Out of memory (unable to allocate 1874648 bytes of shared
pool memory). ] (csr_id:720599) [shp_alloc.c:538:shp_malloc_dbginfo
SQL
복사
원인
다량의 리터럴쿼리는 Shared Pool(이하 SHP)에 다량의 ppc할당을 위한 메모리 점유-해지를 반복하며 메모리 단편화를 야기합니다. 또한 ALTER SYSTEM FLUSH PPC 명령어를 적용해도 해지하고자 하는 PP들의 Life Cycle이 끝나지 않는다면, 메모리 점유는 해지되지 않으므로 OUT_OF_SHP 에러가 발생할 수 있습니다.
해결
1. 쉘스크립트 작성
#!/bin/bash
if [ $# != 2 ]; then
echo "usage: max_chunk.sh [CHUNK] [DUMP]"
exit
fi
max=0
for i in `grep $1 $2 | awk '{print $2}'`
do
if [[ "$i" -gt "$max" ]]; then
max="$i"
fi
done
max_m=`expr $max / 1024 / 1024`
echo "the largest $1 chunk size in $2 is $max_m Mbytes"
SQL
복사
참고
편의성에 맞춰 max_m 변수 단위를 조정해 사용합니다.
2. SHARED DUMP 수행
SQL> ALTER SYSTEM DUMP SHARED POOL;
System altered.
SQL
복사
3. DUMP 발생 확인
DUMP 발생 기본위치: $TB_HOME/instance/$TB_SID/dump/tracedump 또는 TRACE_DUMP_DEST 파라미터값 위치
4. 쉘스크립트 수행
# sh max_chunk.sh FREE tb_dump_3256_38_1404859.trc
the largest FREE chunk size in tb_dump_3256_38_1404859.trc is 1 Mbytes
SQL
복사
5. 결과확인
쉘스크립트 수행 결과, 사용 가능한 SHP의 연속적인 공간은 1MB로, 단편화가 발생했음을 추정할 수 있습니다.