이거 맘대로 되는 세상이 아니구만...

java.sql.SQLException: ORA-06510 오라클에러 본문

카테고리 없음

java.sql.SQLException: ORA-06510 오라클에러

바이홍 2009. 3. 10. 13:37
반응형

 
java.sql.SQLException: ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at "***********************", line 616
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
ORA-06512: at line 1

01560 : tablespace에 충분한 공간이 없을때
01560, 00000, 'global hash table size mismatch for %s (%s != %s)'
// *Cause: The specified 'gc_' INIT.ORA parameter was incompatible
// with that of another instance which already has the database mounted.
// *Action: Fix the 'gc_' parameter and restart.

======================================================================
ORA-01562 조치방법 : MAXEXTENTS (DEFAULT 121)에 도달한 경우
======================================================================

ROLLBACK SEGMENT는 TRANSACTION을 수행하면 필요한 만큼의 EXTENT를 발생하여 그 크기가 증가된 이후에는  그 TRANSACTION이  COMMIT혹은 ROLLBACK되더라도  SIZE가 줄  어들지 않는다.  (OPTIMAL을 지정하지  않는  경우)  이것은 DB를  SHUTDOWN후 다시  STARTUP 하여도  마찬가지이며, ROLLBACK  SEGMENT가 자신이  속한  TABLESPACE로 부터  EXTENT를 할  당받다가 더  이상 할당받을  EXTENT가 없을  때, 혹은 이미 MAXEXTENTS  (DEFAULT 121)에 도달한 경우에 ORA-1562가 발생한다.

1. 현재 ROLLBACK SEGMENT가 포함되어 있는 RBS TABLESPACE의 크기 확인

sqlplus system/manager
SQL> SELECT  file_name, bytes
       FROM  dba_data_files
      WHERE  tablespace_name = 'RBS';

         FILE_NAME                 BYTES
------------------------------- ------------
/oracle/pms/dbs/rbsPMS01.dbf      20971520
/oracle/pms/dbs/rbsPMS02.dbf      10485760

여기에서 나타난 결과값이 절대적으로 작은 경우 RBS TABLESPACE에 DATAFILE을 ADD 시켜줄 필요가 있다.

2. 각 ROLLBACK SEGMENT의 SIZE및 발생한 EXTENT의 수 확인

sqlplus system/manager
SQL> SELECT  segment_name, initial_extent, next_extent, maxextents, rssize, extents, xacts
       FROM  dba_rollback_segs a, v$rollstat b
      WHERE  a.segment_id = b.usn;

결과는 다음과 같은 형태로 나온다.

(1) INITIAL_EXTENT는 ROLLBACK SEGMENT가 필요한 경우 처음으로 자신의 SPACE를 잡는 크기이며, 이 크기만   큼의 연속된 공간을 RBS TABLESPACE로 부터 잡는다.

(2) NEXT_EXTENT는 INITIAL_EXTENT를 잡은 후에 추가적으로 SPACE가 필요한 경우 이 크기만큼씩 SPACE를 잡게 된다.

(3) MAXEXTENTS는 각 ROLLBACK SEGMENT에 지정된 최대 발생가능한 EXTENT의 갯수이다.
  여기에 설정된 값 이상의 EXTENT를 발생시킬 수 없다.

(4) RSSIZE는 현재 각 ROLLBACK SEGMENT가 잡고 있는 RBS TABLESPACE내의 ROLLBACK SEGMENT의 크기이다. 

(5) EXTENTS는 현재 각 ROLLBACK SEGMENT별로 발생한 EXTENT의 갯수이다. 

(6) XACTS는 현재 각 ROLLBACK SEGMENT를 잡고 있는 ACTIVE ROLLBACK TRANSACTION의 갯수이다.  ROLLBACK SEGMENT를 OFFLINE하거나 DROP할 때는 이 XACTS가 0인지 확인하고 작업하여야 한다.

 (컬럼 이름은 편의상 축소하였다.)
  SEGMENT   INITIAL    NEXT      MAX    RSSIZE    EXNTENTS    XACTS
 --------- --------- -------- -------- --------- ---------- --------
 SYSTEM      262144   262144     121    407552        8         0
 R01         262144   262144     121    530432        2         0
 R02         262144   262144     121    3192832      12         0
 R03         262144   262144     121    5056512      19         0
 R04         262144   262144     121    11180032     42         1

이때 ORA-1562발생시  표시된 message에  나타난 ROLLBACK  SEGMENT이름의 EXTETNS가  MAX_EXTETNS의 수와  같으면, 이것은 그 ROLLBACK SEGMENT가 MAXEXTENT에 도달하여 이 오류가 발생한 것이고, 그렇지 않은 경우는 TRANSACTION에 필요한 SPACE가 더 이상 RBS TABLESPACE에 FREE SPACE로 남아 있는 것이 없어서 발생한  것이다.

3. 가능한 조치 방법

(1) 2번의  QUERY 결과  MAXEXTENT에 도달하지도  않았고, 오류가  발생한 TRANSACTION을  처리할 만큼 큰  크기의 RSSIZE가 있는 ROLLBACK SEGMENT도 없는  경우에는 1번의 조회 결과 나타난 RBS의  DATAFILE이외에  추가적으로 RBS TABLESPACE에 새로운 DATAFILE을 추가하여야 한다.

 sqlplus system/manager
 SQL> ALTER TABLESPACE rbs ADD DATAFILE '/oracle/pms/dbs/rbsPMS03.dbf' SIZE 50M;

(2)  2번의 조회를  확인한 결과,  오류가 발생한  ROLLBACK SEGMENT의  RSSIZE보다 큰  RSSIZE를 가지는  ROLLBACK  SEGMENT가 존재하여  이 TRANSACTION을  수행하기에 충분  하다고 판단되는  경우 그  ROLLBACK  SEGMENT를  지정하여 사용할  수 있다.  RSSIZE가 매우  큰 ROLLBACK  SEGMENT가 R04라고  할때, SQLPLUS  상에서는 다음과 같이 하면된다.

SQL> SET TRANSACTION USE ROLLBACK SEGMENT r04 ;

일반적으로 BATCH JOB과 같이 ROLLBACK SEGMENT가 많이 필요한 TRANSACTION에 대해서는 INITIAL과  NEXT가  크게 지정되어 있는 큰 크기의 ROLLBACK SEGMENT를 지정하여 사용하는 것이 효율적이다.

(3) 2번의 조회에서  획인 된 INITIAL_EXTENT와  NEXT_EXTENT가 작아 실제로는  RBS의 FREE SPACE가  남아있는데도 MAXEXTENT에 도달하여 ORA-1652가 발생하는 경우 ROLLBACK SEGMENT의 INITAL과 NEXT를 크게 하여  ROLLBACK SEGMENT를 재생성할 수 있다.

 참고)
 각 TABLESPACE별 FREE SPACE는 다음과 같은 방법으로 확인가능하다.
 sqlplus system/manager
 SQL> SELECT tablesapce_name, sum(bytes), max(bytes)
        FROM dba_free_space
       GROUP BY tablespace_name;

(4) 이러한 ROLLBACK SEGMENT에 관한 오류는 ROLLBACK SEGMENT가 일단 필요한 SPACE를 확보한 이후에는 그  크기가 줄어들지 않는 것이 그 원인이 될 수도 있는데 이때 ROLLBACK SEGMENT에 OPTIMAL SIZE를  지정하면  어느 정도의 해결이 가능하다. OPTIMAL을 지정하면 ROLLBACK SEGMENT가 그 크기 이상으로 증가되는  경우,  이후 OPTIMAL로 지정된 크기만  유지하도록 ROLLBACK SEGMENT가 줄어들게  된다. 이때, 이값을 너무  작게  잡으면 빈번하게 ROLLBACK SEGMENT가 늘어나고  줄어드는 작업으로 인해 PERFORMANCE에 지장을  초래할 수  있으므로 20~30개의 EXTENT정도를 보유할 수 있도록 한다.

OPTIMAL의 지정 방법은 ROLLBACK SEGMENT생성시나 그 이후에 다음과 같이 하면 된다.

 sqlplus system/manager
 SQL> CREATE ROLLBACK SEGMENT r01
             TABLESPACE rbs
             STORAGE (INITIAL 1M NEXT 1M OPTIMAL 20M) ;

 이미 생성된 rollback segment에 대해서는,
 SQL> ALTER ROLLBACK SEGMENT r01 STORAGE(OPTIMAL 20M);

에러정보 : http://myweb.bcpark.net/~truedog/frame/sub11_frame.htm
2009/03/10 09:14 2009/03/10 09:14
반응형
Comments