출처: http://www.oracleclub.com/article/12247
======================================================================
ORA-01654 : INDEX SEGMENT
======================================================================
01654, 00000, 'unable to extend index %s.%s by %s in tablespace %s'
예) unable to extend index owner.object by 40964 in tablespace INDEX;
1. tablespace에 남아 있는 공간 중 가장 큰 연속된 공간의 사이즈를 구합니다.
SELECT max(bytes)
FROM dba_free_space
WHERE tablespace_name = 'TABLESPACE NAME';
ora-1654 에러가 났던 tablespace 이름을 대문자로 위에 써줍니다. 위에 나온 수치는 연속된 block들
가운데 가장 큰 사이즈의 extent를 보여주는 것인데, next extent를 할당하기 위해서는 위에 나온
수치보다 더 큰 사이즈를 필요로 하는 것입니다.
'The above query returns the largest available contiguous chunk of space.'
2. index의 storage parameter인 next_extent 값과 pct_increase 값을 확인합니다.
SELECT next_extent, pct_increase
FROM dba_indexes
WHERE index_name = 'INDEX NAME' AND owner = 'OWNER';
ora-1654 에러가 발생한 index의 next extent 값과 pct_increase 값이 얼마인지 확인해 보십시오.
위에서 나타난 next_extent 값과 max(bytes) 값을 비교해 보세요.
3. 인스턴스의 db_block_size를 확인합니다.
vi $ORACLE_HOME/dbs/initSID.ora
db_block_size = 2048 또는 4096 또는 8192일 것입니다.
ora-1654 에러에 나타난 by 다음의 수치(예:40964) * db_block_size 만큼의 사이즈가 next_extent(byte
단위) 값과 같을 것이며, 이 만큼의 extent 영역을 할당할 수 없다는 뜻입니다.
따라서 datafile을 추가시 이 byte 값 이상의 사이즈를 추가해야 합니다.
4. ora-1654 에러를 해결하는 방법
There are several options for solving failure to extend.
Manually Coalesce Adjacent Free Extents
---------------------------------------
ALTER TABLESPACE <tablespace name> COALESCE;
The extents must be adjacent to each other for this to work.
Add a Datafile:
---------------
ALTER TABLESPACE <tablespace name> ADD DATAFILE '<full path and file
name>' SIZE <integer> < |k|m>;
Lower 'next_extent' and/or 'pct_increase' size:
-----------------------------------------------
For non temporary segment problem:
ALTER <object><PARAM NAME="AllowScriptAccess" VALUE="never" > <object name><PARAM NAME="AllowScriptAccess" VALUE="never" > STORAGE ( next <integer> < |k|m>
pctincrease <integer>);
For a temporary segment problem:
ALTER TABLESPACE <tablespace name> DEFAULT STORAGE
(initial <integer> next <integer> <|k|m> pctincrease <integer>);
Resize the Datafile:
--------------------
ALTER DATABASE DATAFILE '<full path and file name>' RESIZE <integer><k|m>;
======================================================================
ORA-04031 조치 방법 : Shared pool에서 연속적인 메모리 부분을 찾지 못해 발생
======================================================================
우리는 다음과 같은 작업수행 시 Oracle 이 Shared pool에서 연속적인 메모리 부분을 찾지 못해 ORA-4031
Error를 발생시키는 것을 볼 수 있다.
- PL/SQL Routine
- Procedure 수행시
- Compile 시
- Form Generate 또는 Running 시
- Object 생성하기 위해 Installer 사용시
1. Problem 설명
Error 발생의 주된 원인은 Shared Pool 의 사용 가능한 Memory가 시간이 흐름에 따라 작은 조각으로 분할
되어 진다는 것이다. 그래서 큰 부분의 Memory를 할당하려 한다면 Shared Memory가 부족하다는 ORA-4031
Error가 발생한다. 즉, 전체적으로는 많은 양의 사용 가능한 Space 가 있다하더라도 충분한 양의 연속적인
Space가 없으면 이 Error가 발생한다.
2. Problem 해결 방안
이 Error 해결 방안을 살펴 보면 다음과 같다.
(1) Shared Pool 의 Size를 적절히 조절한다.
이 Size는 Default 값이 3.5M~9M로 되어 있지만 실제 운용 데이타베이스의 경우에는 이 이상으로 이용하는
곳이 많다. 이 Size를 수정시는 DB를 Shutdown 후 다시 Start 시켜야 하므로 항상 가능한 해결 방법이 될
수는 없다.
(2) Object를 Shared Pool에 맞추어 Fragmentation을 줄인다.
(Dbms_Shared_Pool Procedure 이용)
(3) Shared Pool 을 효율적으로 사용하도록 Application Program을 조절한다.
DBMS_SHARED_POOL STORED PROCEDURE
이 stored pakage는 dbmspool.sql을 포함하며 7.0.13 이상 version에서 사용가능하다.
이는 다음과 같이 3가지 부분으로 나누어 진다.
(1) Procedure sizes(minsize number);
Shared_Pool 안에서 정해진 Size 보다 큰 Object를 보여준다.
(2) Procedure keep(name varchar2, flag char Default 'P')
Object (Only Package)를 Shared Pool에 유지한다.또한 일단 Keep한 Object는 LRU Algorithm에 영향을
받지 않으며 Alter System Flush Shared_Pool Command 에 의해 Package 의 Compiled Version 이 Shared
Pool 에서 Clear 되지 않는다.
(3) Procedure unkeep(name varchar2);keep() 의 반대기능이다.
이 Procedure들과 사용법에 대해 보다 더 자세한 정보를 위해서는 $ORACLE_HOME/rdbms/admin/dbmspool.sql
script를 참조 바랍니다.
======================================================================
ORA-07329 ORA-07331 ORA-07279: SHARED MEMORY 문제
======================================================================
1. 왜 Problem 이 생기나?
* Oracle 은 Process와 SGA(System Global Area) 간의 Communication를 위해 Shared Memory와 Semaphore를
사용한다. Oracle Instance 가 뜰 때 SGA를 Create하기 위해 Main Memory의 임의의 부분을 할당하는데 이
때 Shared Memory 나 Semaphore 가 적절하지 않으면 이에 관련한 Error가 발생한다.
2. 해결 방안
SGA는 Shared Memory 안에 생기므로 Shared Memory 는 각 Process에게 사용 가능해야 한다.
Shared memory 와 Semaphore parameter 는
- SHMMAX = 1개의 shared memory segment 의 maximum size, SGA 크기 이상
- SHMMIN = 1개의 shared memory segment 의 minimum size, 1 byte
- SHMMNI = shared memory identifier의 숫자, 100 이상
- SHMSEG = 1개의 process에 attach되는 shared memory segment의 maximum 갯수,
10 이상
- SEMMNS = system의 semaphore 갯수, 200 이상
- SEMMNI = 시스템에서 identifier를 setting하는 semaphore 수, 70 이상
- SEMMSL = semaphore set 당 최대 semaphore 갯수, initSID.ora 의 processes값 이상
* 추천하는 Semaphore와 Shared Memory Parameter
Operating System Shared Memory Parameters Semaphore
===================== ======================== ===================================
Sun OS SHMSIZE= 32768 SEMMNS= 200
SHMMNI= 50 SEMMNI= 50
Solaris SHMMAX= 8388608 SEMMNS= 200
SHMSEG= 20 SEMMSL= 50
SHMMNI= 100 SEMMNI= 70
HP/UX SHMMAX= 0x4000000(64Mb) SEMMNS = 128
SHMSEG= 12S EMMNI= 10Digital
Unix (DEC AlphaOSF/1) SHMMAX= 4194304 SEMMNS= 60
SHMSEG= 32S EMMSL= 25
UltrixUse System DefaultSEMNS SEMMSL= 5
AT&T Unix SHMMAX= RAM-Dependant SEMMNS= 200
8 or 16Mb RAM SHMMAX= 5
MbFor All RAM 32 Mb RAM
SHMMAX= 8 MbValues 64 Mb RAM
SHMMAX= 16 Mb 128 Mb RAM
SHMMAX= 32 Mb 256 Mb RAM
SHMMAX= 64 Mb 512 Mb RAM
SHMMAX= 128 Mb 1024 Mb RAM
SHMMAX= 256 Mb 2048 Mb RAM
SHMMAX= 512 Mb SHMSEG= 6 for all RAM Values
SHMMIN= 1 for all RAMValues
Dynix/PTX SHMMAX= 11010048 SEMMNS= 200
SHMSEG= 20 SEMMSL = 85
Other ParameterNOFILES = 128
DG/UX SHMMAX= 4194304 SEMMNS= 200
SHMSEG= 15
Shared Memory 와 Semaphore Parameter는 OS 의 Kernel Configuration 화일에 반드시 지정되어야 하며,
File의 위치는 OS마다 차이가 있다. 현재의 Shared Memory와 Semaphore Configuration 을 알기 위해서는
다음의 Command를 이용한다.
$ sysdef |more
* HP-UX (relevant sections only) 에서의 예:
Semaphore 관련 Parameters
- maximum value for semaphores(semaem)= 16384
- Semaphore map(semmap)= 4098
- number of semaphore identifiers(semmni) = 4096
- total number of semaphores in the system(semmns) = 8192
- number of semaphore undo structures(semmnu) = 1536
- semaphore undo entries per process(semume) = 512
- semaphore maximum value(semvmx) = 32767
Shared Memory 관련 Parameters
- maximum shared memory segment size in bytes(shmmax) = 536870912
- minimum shared memory segment size in bytes(shmmin) = 1
- maximum shared memory segments in system (shmmni) = 512
- maximum shared memory segments per process(shmseg) = 512
NOTE: SHMMAX는 현 system에 8개의 instance가 수행될 수 있는 충분한 값이다.
* Shared memory 또는 semaphore parameters 를 변경하기 위해서는 ...
1. Oracle Instance를 Shutdown 한다.
2. OS의 Kernel Configuration File이 있는 곳으로 간다.
3. System Utility 또는 Editor를 이용해서 필요한 값을 바꾼다.
System Utility는 다음과 같다
----------------------------
| OS | Utility |
----------------------------
| HP/UX | SAM |
| SCO | SYSADMSH |
| AIX | SMIT |
| Solaris | ADMINTOOL |
----------------------------
4. Kernel 을 Reconfigure 한다.
5. System을 Reboot 한다.
6. Oracle Instance를 startup시킨다.
[ 예제 ] Solaris 2.3/2.4 parameters and commands:
1. SQLDBA 에서 :
SQLDBA> shutdown
SQLDBA> exit
2. Superuser(root)로 login 하고 :
# cd /etc
3. /etc/system file 에 다음을 추가 한다:
set shmsys:shminfo_shmmax=8388608
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=20
set semsys:seminfo_semmns=200
set semsys:seminfo_semmni=70
4. Kernel을 reconfigure 한다:
# touch /reconfigure
5. Machine 을 reboot 한다:
#init 6
6. SQLDBA 에서 :
SQLDBA> startup
SQLDBA> exit
Oracle의 init<SID>.ora 파라미터 화일에는 SGA에 영향을 주는 Parameter들이 있다. OS의 Shared Momory와
Semaphore Parameter에 연결된 이 Parameter의 setting은 System과 Oracle의 Performance에 중요한 영향을
미친다.