UNDO 와 Snapshot too old 에러

UNDO Tablespace

Snapshot too old 


UNDO Tablespace


UNDO는 SESSION 에서 DML 작업을 수행하면 원본 데이터를 저장하는 Tablespace 이다. 

한마디로 A라는 Session에서 데이터를 변경중(Commit을 하지 않음)일때 B Session이 변경중인 행을 조회했을때 B Session은 원본데이터가 조회된다. 그때 그 원본 데이터는 Undo에 들어있다. 이걸두고 CR(Consistant Read:읽기 일관성) 라고 한다.

그런데 어떻게 그 행이 변경중것과 Undo Tablespace 상의 원본데이터 위치를 알 수 있을까? 그건 Block Header의 ITL( Interested Transaction Lis )에 그 정보가 들어있다. ITL Slot에는 현재 변경중인 행과 그 행의 Undo Segment 의 Point가 들어있다. (자세한 내용 참조  http://tawool.tistory.com/193 )


현재 상태 조회
show parameter undo;
새로운 Undo Tablespace 생성
CREATE UNDO TABLESPACE 이름
DATAFILE '생성파일명' SIZE 100M
[AUTOEXTEND ON] 
Undo Tablespace 변경
즉시 변경된다. ( Pfile을 사용중이면 재시작시 적용을 위해 반드시 수정해야함. )
ALTER SYSTEM SET UNDO_TABLESPACE=이름
Session 별 할당중인 Undo Segment 확인
SELECT a.sid, a.serial#, a.username, b.name "SEGMENT"
FROM v$session a, v$transaction t, v$rollname b
WHERE a.taddr = t.addr
AND t.xidusn = b.usn;





Snapshot too old
ORA-01555 Snapshot too old

발생원인 
이 에러의 발생원인은 UNDO의 데이터를 다른 Session에서 읽는중에 있는 해당 segment가 트랜젝션이 완료되어 새로운 데이터로 덮어 써지는 경우에 발생한다.  

해결법
이 에러에 부닥치게 된다면 두가지를 의심한다. 하나는 UNDO의 크기이고 두번째는 UNDO_RETENTION 파라미터를 설정값이다. 

UNDO 의 구조를 잠깐 보자.
UNDO는 계속 늘어나고 줄어들지 않는 특징이 있다.  트랜젝션 A,B,C,D에 대한 undo Segment 가 있다. 이때 새로운 E 트랜젝션이 발생하면 일단 존재하는 Segmemt중에 트랜젝션이 완료된 segment를 찾아서 덮어쓴다. 만약 다른 Session 에서 읽는중이더라도 E 트랜젝션은 덮어써버린다. 이때 발생하는것이 위의 에러인데. 이를 방지하기 위해서 UNDO_RETENTION 파라미터를 설정한다.

UNDO_RETENTION  
이 값은 트랜젝션이 완료된 Segment가 설정시간동안 다른 서버프로세스에 의해 덮어쓰지 못하도록 보호한다.
하지만 이 값도 undo Tablespace의 공간이 부족하게 되면 보장되지 않는다.

보장하기 위해서는 undo_retention_guarantee 옵션을 활성화 해야 한다. 
ALTER TABLESPACE undoTablespace이름 RETENTION GUARANTEE | NOGUARANTEE;

SELECT tablespace_name, retention FROM dba_tablespaces;

만약 undo Tablespace 의 최대 크기가 정해져 있다면 주의해야 한다. Undo Tablespace 가 부족하면 가용성을 지킬 수 없게 된다.




10g에서는 이와같은 snapshot too old 에러를 줄이기 위해 자동으로 관리하는 기능을 제공한다.


'Oracle > Administrator' 카테고리의 다른 글

수동으로 다수 데이터베이스 생성 + EM  (0) 2012.03.28
관리 쿼리 모음  (0) 2012.03.11
External Tables 외부 테이블  (0) 2011.09.29
Index  (0) 2011.09.29
GRANT, REVOKE : DCL(Data Control Language)  (0) 2011.09.27