본문 바로가기
IT

오라클 타임스텐 데이터베이스 공간 늘리기 - ORA-02356 에러와 TT836 에러 처리 방법

by developer's warehouse 2024. 4. 3.

테스트 도중 ORA-02356 오류가 발생하였습니다. 매뉴얼을 찾아보니 Timesten 데이터베이스에서 영구 공간(Permanent Space)이 부족한 경우 발생한다고 합니다. 즉, ORA-02356 오류는 데이터베이스의 공간이 부족하여 작업을 계속할 수 없음을 나타냅니다.

오라클 타임스텐 데이터베이스 공간 늘리기 - ORA-02356 에러 처리 방법 썸네일

오라클 타임스텐의 Permanent Space와 확인 방법

오라클 타임스텐 데이터베이스의 크기를 결정하는 파라메터는 PermSize(PERM_ALLOCATED_SIZE)입니다.

이 수치는 데이터베이스의 영구 메모리 영역 크기를 지정하는 매개변수입니다. 이 영역은 TimesTen 데이터베이스의 실제 데이터를 저장하는 곳입니다. 즉, 테이블과 인덱스 등이 영구 메모리 영역에 저장됩니다.

 

PermSize는 영구 메모리 영역의 크기를 지정합니다.
영구 메모리 영역은 데이터베이스가 메모리에 로드될 때 생성되며, 데이터베이스가 메모리에서 언로드 될 때 파괴됩니다.
PermSize는 모든 데이터를 충분히 저장할 수 있도록 설정해야 합니다. 데이터 크기가 PermSize보다 크면 오류가 발생합니다.
PermSize는 데이터베이스를 다시 시작하여 증가시킬 수 있지만, 감소시킬 수는 없습니다.

 

ORA-02356 오류를 해결하기 위해 먼저 현재 데이터베이스에 설정된 값을 확인해야합니다.

sys.odbc.ini 파일에 정의된 PermSize(PERM_ALLOCATED_SIZE) 값을 확인하거나 ttIsql의 dssize 명령을 사용하여 확인할 수 있습니다.

예를 들어, 제 시스템의 경우에는 아래와 같이 32MB로 되어있습니다.

$ ttIsql tpcc

Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.



connect "DSN=tpcc";
Connection successful: DSN=tpcc;UID=tpcc;DataStore=/home/timesten/tt_instances/ttinstance/db/tpcc;DatabaseCharacterSet=KO16MSWIN949;ConnectionCharacterSet=US7ASCII;DRIVER=/home/timesten/tt_instances/ttinstance/install/lib/libtten.so;
(Default setting AutoCommit=1)
Command> dssize
The following values are in MB:

  PERM_ALLOCATED_SIZE:      32
  PERM_IN_USE_SIZE:         31.991
  PERM_IN_USE_HIGH_WATER:   31.991
  TEMP_ALLOCATED_SIZE:      40
  TEMP_IN_USE_SIZE:         7.689
  TEMP_IN_USE_HIGH_WATER:   7.838

 

오라클 타임스텐의 Permanent Space 늘리기

PermSize를 확인하였으면 해당 값을 늘려서 데이터베이스의 크기를 늘려줍니다. 이를 위해서 PermSize(PERM_ALLOCATED_SIZE) 파라메터를 증가시킵니다.
$TIMESTEN_HOME/conf 폴더로 이동하여 sys.odbc.ini 파일에서 PermSize 파라메터를 추가하거나 수정해 줍니다.

[tpcc]
Driver=/home/timesten/tt_instances/ttinstance/install/lib/libtten.so
DataStore=/home/timesten/tt_instances/ttinstance/db/tpcc
DatabaseCharacterSet=KO16MSWIN949
PermSize=1024
TempSize=128
LogBufMB=256
LogFileSize=256


위의 예시에서는 매개변수를 1GB로 변경했습니다.
파라메터를 적용시키기 위해서 TimesTen 데몬을 재시작합니다.

timesten:~/tt_instances/ttinstance/conf$ ttDaemonAdmin -stop
TimesTen Daemon (PID: 846811, port: 6624) stopped.
timesten:~/tt_instances/ttinstance/conf$ ttDaemonAdmin -start
TimesTen Daemon (PID: 879622, port: 6624) startup OK.

 

데몬을 재시작 한 후 admin 계정으로 해당 DSN을 통해 접속을 한번 해줘야 합니다.

만약, UID나 PWD가 admin 계정이 아닌 경우 에러가 발생하므로, UID와 PWD는 삭제 후 admin으로 접속을 해주는 것이 필요합니다.


이와 같이 조치를 취하면 ORA-02356 오류가 해결되고 대신 PERM_IN_USE_SIZE 값이 증가할 것입니다.

 

공유메모리 관련 문제로 인한 TT836 에러 

1GB의 경우 어렵지 않게 설정이 가능합니다. 하지만, 더 큰 값으로 변경하는경우 다음과 같은 TT836에러가 발생합니다. 

이 경우는 shared-memory를 크게 생성할 수 없기 때문이며, OS의 파라메터에 의해서 결정됩니다. 

$ ttIsql tpcc

Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

connect "DSN=tpcc";
  836: Cannot create database shared-memory segment, error 12
  703: Subdaemon connect to database failed with error TT836
The command failed.
Done.

 

리눅스에서 공유메모리 한계 확인하기

리눅스에서는 shmmax와 shmall을 통해서 공유메모리 한계를 설정할 수 있습니다. 

먼저 다음과 같이 sysctl 명령을 사용해서 값을 확인합니다. 

$ sudo sysctl -a |grep shm
kernel.shm_next_id = -1
kernel.shm_rmid_forced = 0
kernel.shmall = 40000000000
kernel.shmmax = 5000000000000
kernel.shmmni = 32768
vm.hugetlb_shm_group = 0

 

만약 해당 값이 작게 설정되어있다면 다음의 명령을 통해 적용할 수 있습니다. 

1. sudo sysctl -w kernel.shmmax = [원하는 값(바이트단위)] 

2. sudo sysctl -w kernel.shmall = [원하는 값(페이지수)] 

다른 방법으로 sysctl.conf를 수정후 sysctl -p를 수행할 수도 있습니다. 

sysctl -p는 /etc/sysctl.conf에 설정된 커널 파라메터 값을 이용해서 커널 파라메터를 수정합니다. 

그러므로, /etc/sysctl.conf에 kernel.shmmax와 kernel.shmall 을 수정후 sysctl -p를 수행하면 됩니다. 

예를들어 아래와 같이 /etc/sysctl.conf가 설정되어있고, sudo sysctl -p를 수행하면 아래 설정된 값으로 수정됩니다. 

#kernel.sysrq=438

kernel.shmmax = 5000000000000
kernel.shmmni = 32768
kernel.shmall = 40000000000
kernel.sem = 1000 32768000 1000 32768
kernel.msgmnb = 1048576
kernel.msgmax = 1048576
kernel.msgmni = 32768

net.core.netdev_max_backlog = 80000
net.core.rmem_default = 2097152
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

vm.overcommit_memory = 2
vm.overcommit_ratio = 95
kernel.shmmax = 5000000000000
kernel.shmmni = 32768
kernel.shmall = 40000000000
kernel.sem = 1000 32768000 1000 32768
kernel.msgmnb = 1048576
kernel.msgmax = 1048576
kernel.msgmni = 32768

net.core.netdev_max_backlog = 80000
net.core.rmem_default = 2097152
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

vm.overcommit_memory = 2
vm.overcommit_ratio = 95

 

sudo sysctl -p  명령 수행 결과

$ sudo sysctl -p
kernel.shmmax = 5000000000000
kernel.shmmni = 32768
kernel.shmall = 40000000000
kernel.sem = 1000 32768000 1000 32768
kernel.msgmnb = 1048576
kernel.msgmax = 1048576
kernel.msgmni = 32768
net.core.netdev_max_backlog = 80000
net.core.rmem_default = 2097152
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
vm.overcommit_memory = 2
vm.overcommit_ratio = 95
kernel.shmmax = 5000000000000
kernel.shmmni = 32768
kernel.shmall = 40000000000
kernel.sem = 1000 32768000 1000 32768
kernel.msgmnb = 1048576
kernel.msgmax = 1048576
kernel.msgmni = 32768
net.core.netdev_max_backlog = 80000
net.core.rmem_default = 2097152
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
vm.overcommit_memory = 2
vm.overcommit_ratio = 95

 

저의 경우 해당 값이 충분히 큰데도 불구하고 타임스텐의 공유메모리 할당이 실패합니다. 

 

메모리 할당 오류 (errno 12 out of memory) 발생시 문제 분석

errno 12 out of memory로 인해서 공유메모리 생성이 계속 실패하는 경우에는 vm.overcommit_memory의 값을 확인해 봐야 합니다. 

/proc/sys/vm/overcommit_memory 파일을 확인하거나  메모리 관리 설정을 조정해야합니다. 
만약 이 값이 값이 0이면 기본 메모리 관리를 사용하고, 1이면 메모리 과다 할당을 허용하며, 2이면 메모리 과다 할당을 금지합니다. 

그러므로, 이 값이 2인 경우 메모리를 크게 할당하면 out of memory가 발생할 수 있습니다. 

 

결론적으로 다음과 같이 /etc/sysctl.conf에서 vm.overcommit_memory = 1로 수정한 후, sudo sysctl -p를 수행하여 vm.overcommit_memory 값을 큰 메모리 할당을 허용해 주면 성공합니다. 

$ sudo vi /etc/sysctl.conf
vm.overcommit_memory = 1 <-- 1로 수정
timesten:~/tt_instances/ttinstance/conf$ sudo sysctl -p
kernel.shmmax = 5000000000000
kernel.shmmni = 32768
kernel.shmall = 40000000000
kernel.sem = 1000 32768000 1000 32768
kernel.msgmnb = 1048576
kernel.msgmax = 1048576
kernel.msgmni = 32768
net.core.netdev_max_backlog = 80000
net.core.rmem_default = 2097152
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
vm.overcommit_memory = 2
vm.overcommit_ratio = 95
kernel.shmmax = 5000000000000
kernel.shmmni = 32768
kernel.shmall = 40000000000
kernel.sem = 1000 32768000 1000 32768
kernel.msgmnb = 1048576
kernel.msgmax = 1048576
kernel.msgmni = 32768
net.core.netdev_max_backlog = 80000
net.core.rmem_default = 2097152
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
vm.overcommit_memory = 1
vm.overcommit_ratio = 95

 

오늘은 타임스텐 데이터베이스의 PermSize를 늘리는 방법과 공유메모리 할당시 발생한 에러를 처리하는 방법에 대해서 알아보았습니다. ORA-02356 에러가 발생하면 당황하지 말고 타임스텐의 데이터베이스 크기를 늘려주시면 간단하게 해결되니 참고해서 처리하시면 되겠습니다.

facebook twitter kakaoTalk kakaostory naver band shareLink