테스트 도중 ORA-02356 오류가 발생하였습니다. 매뉴얼을 찾아보니 Timesten 데이터베이스에서 영구 공간(Permanent Space)이 부족한 경우 발생한다고 합니다. 즉, ORA-02356 오류는 데이터베이스의 공간이 부족하여 작업을 계속할 수 없음을 나타냅니다.
Table Of Contents
오라클 타임스텐의 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 에러가 발생하면 당황하지 말고 타임스텐의 데이터베이스 크기를 늘려주시면 간단하게 해결되니 참고해서 처리하시면 되겠습니다.
'IT' 카테고리의 다른 글
오라클 타임스텐 파이썬(Python)으로 원격 접속 하기 - Client/Server Connection (22) | 2024.04.05 |
---|---|
오라클 타임스텐 DBMS Client/Server 연결하기 (23) | 2024.04.04 |
파이썬(python)으로 오라클 타임스텐 데이터베이스 접속하고 DML 실행하기 (0) | 2024.04.02 |
오라클 타임스텐 데이터베이스 시작 및 종료와 사용자 생성하기 (22) | 2024.04.01 |
우분투 리눅스에서 오라클 타임스텐 데이터베이스 생성 및 기본 명령 수행하기 (0) | 2024.04.01 |