ORA-27102: out of memory

HARIBO·2021년 4월 26일
0

현상

웹 애플리케이션이 응답하지 않아 톰캣과 데이터베이스를 확인해 봤다. 톰캣은 실행 중 이었지만 sqlplus로 데이터베이스를 시작해 보았지만

ORA-27102: out of memory
Linux-x86_64 Error: 12: Can_out of memorynot allocate memory

라는 오류가 뜨면서 실행되지 않았다. 톰캣이 실행 중이 아닐때는 실행되었기에 메모리 부족 문제인것 같았다. (총 메모리 3G)
오라클 11g에서는 PGA(사용자 메모리), SGA(공유 메모리)를 자동으로 관리한다고 해서 SQL 명령어로 memory_target를 512M로(원래 1G) 설정할 계획이었으나 오타로 5120M(5G)로 설정하고 말았다.

그 이후

ORA-47500: XE edition memory parameter invalid or not specified

라면서 startup도 되지 않았다.
찾아보니 오라클 XE버전은 1G이상의 메모리를 설정할 수 없다고 한다.
오라클 접속이 불가능하니 수동으로 메모리 할당을 하려고
ORACLE_HOME/dbs의 spfile<SID>.ora 파일을 vi 편집기로 수정하였으나...
이 파일은 바이너리 파일로 일반적인 방법으로 수정 시 영구적으로 손상된다고 한다.

오라클은 초기 실행 시 spfile<SID>.ora(spfile) -> init<SID>.ora(pfile) 순서로 찾아서 실행하며 오라클 9i버전부터 spfile을 기본으로 사용하며 spfile은 직접 파일을 수정하지 않고 오라클 명령어로 파라미터를 수정해도 계속 유지된다고 한다.

init<SID>.ora을 대신 사용하려고 했지만 내 디렉토리에는 init<SID>.ora대신 init.ora 파일밖에 없었다.(상위 디렉토리의 admin폴더에도 없었다.) init.ora는 가이드 파일이었기 때문에 복사 후 init<SID>.ora로 이름을 바꾼 뒤, 디렉토리, 컨트롤러 등등을 직접 잡아줘야 했다.
문제는 직접 잡아줘도 실행되지 않았다.(나중에 정상 파일과 대조해 보니 컨트롤러 이름을 ""사이에 넣지 않아서 인 것 같다.)

출처
http://dbcafe.co.kr/wiki/index.php/%EC%98%A4%EB%9D%BC%ED%81%B4_pfile_spfile
https://2factor.tistory.com/63

해결

지우고 다시 설치할까... 라고 생각하면서 오라클 alert log를 보던 중 오라클이 설치돼서 가장 처음 실행될 때는 다른 디렉토리의 프로파일을 사용한다는 것을 발견하고 ORACLE_HOME/config/scripts 아래 init.ora, init<SID>Temp.ora 파일을 발견했다. 이 파일을 복사해 memory_target를 256M로 설정하고 실행하니 SQL은 정상적으로 실행됐다.

해결 2

문제는 톰캣이 실행 중 일때 SQL이 실행되지 않는 것은 그대로였다. 톰캣 문제인 것 같았다.(애플리케이션용 톰캣, cloud-config용 톰캣 총 2개의 톰캣이 있었다.)

톰캣 설치경로/bin/catalina.sh 파일에서
JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx256m -XX:MaxPermSize=128m" 로 수정해 주었다.
Xms: JVM의 최소 메모리 크기
Xmx: JVM의 최대 메모리 크기
XX:MaxPermSize: JVM내의 클래스 정보가 담길 최대 메모리. Xmx과 별도로 할당된다. 최대 할당 메모리 = Xmx + XX:MaxPermSize

출처
https://mycup.tistory.com/215
https://epthffh.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A0%A8-%EC%84%A4%EC%A0%95

추가

jmap -heap [pid]로 톰캣 JVM 메모리 설정을 보려고 했지만 jmap에 -heap 옵션이 없었다. 버전이 올라가면서 없어진 모양이다.(Java11 기준)

Java heap memory 확인법
https://mkyong.com/java/find-out-your-java-heap-memory-size

내 시스템(ergonomics algorithm에 의해 결정된다고 한다)
InitialHeapSize = 48234496(46M)
MaxHeapSize = 746586112(712M)

0개의 댓글