카테고리 없음
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
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
반응형