본문 바로가기

DB/__Oracle

Oracle 노하우 및 팁


출처: 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에 중요한 영향을
 미친다.