본문 바로가기

오라클 ADMIN

Undo

Undo = Rollback


Undo Data

원본 데이터


Undo Tablespace

사용자가 DML을 수행할 경우 Undo Data들을 저장해 두는 특별한 Tablespace

서버 프로세스가 Undo Tablespace에 Undo Segment를 생성해, 각 사용자별로 Undo Segment를 할당에서 Undo Data를 관리

Instance 별로 적어도 하나 이상의 Undo Tablespace가 있어야함


Undo Segment

Undo Data를 저장하고 있는 테이블

종류: System, Non-System, Deferred(만들수없음, 알아서 생성됨, 작업후 자동 삭제)



Undo 목적

1. Transaction Rollback

사용자가 rollback 명령어 수행할 경우 이곳에 저장된 undo data를 사용해 rollback 수행


2. Transaction Recovery

Instance Recovery 라고도 함

Instance crush 비정상종료 되었을 때 Roll Forward와 Roll Backward 작업을 수행해서

Dirty DB를 Clean DB로 만들어 주는 과정에서 Undo Data가 사용된다.


3. Read Consistency (읽기 일관성) = CR 작업

CR작업을 통해 트랜잭션이 끝나지 않은 데이터는 변경 전 데이터를 보여줌

사용자 A가 update를 수행하여 99번 데이터ㄱ을 ㄴ으로 변경하려고 할 때 아직 commit을 하지 않은 상태에서

다른 사용자가 99번 데이터 내용을 조회할 때 ㄴ이 아닌 ㄱ을 보게 된다. 

commit이나 rollback이 수행되기 전까지는 DB Buffer Cache에서 Lock이 설정되어 바뀐 데이터의 내용은 아무도 볼수 없다.

이게 바로 CR 작업


 


Undo Data / Tablespace / Segment 관리 방법

1. Manual Undo Management (MUM)

Tablespace 생성 -> Segment 생성 -> Segment Enable

DBA가 직접 수동으로 관리를 하는 방법

사용자가 DML을 수행하기 전에 undo segment가 할당이 되어야 작업을 할 수 있음, 그래서 수동으로 직접 segment를 생성해 관리


2. Auto Undo Management (AUM)

Tablespace 생성

오라클 서버가 자동적으로 관리, 

Tablespace 생성할 때 충분한 크기를 주고 생성해야 한다. 아니면 autoextend on 옵션을 추가해주면서 자동으로 늘어나게 해주기




Undo Segment 할당 원리

Undo tablespace의 특징 중 하나가 "Undo Data File의 크기는 증가만 가능, 줄어들 수는 없다"

서버 프로세스가 Undo Segment를 확보하려고 할 때 무조건 신규 Undo Segment를 할당 받는 것이 아니라

기존에 만들어져 있던 Undo Segment중에서 트랜잭션이 완료된 것(commit이나 rollback된 트랜잭션)이 있는지 확인 후

트랜잭션이 완료된 Undo Segment가 있으면 그 Undo Segment를 덮어쓰게 됨

하지만 트랜잭션이 완료된 Undo Segment가 없을 경우 새로운 Undo Segment를 생성해서 기록하게 된다.

이런식으로 계속 늘어나게 되는 것임

commit을 수행해도 해당 Undo Segment 안에 있는 Undo Data는 delete 되는것이 아니라 남아있기 때문에 다시 줄일 수 없는 것이다.


줄이고 싶다면

새로운 작은 크기의 Undo Tablespace를 신규로 만들고, 쓰고 있던 Undo Tablespace를 새로운 Undo Tablespace로 변경 한 후

기존의 Undo Tablespace를 삭제해 주면 된다.

방법을 하나씩 살펴보자면,


1. Undo Tablespace 생성


CREATE UNDO TABLESPACE 이름

DATAFILE '경로' SIZE *

AUTOEXTEND ON ;



2. Undo Tablespace 변경 (재부팅 없이 즉시 변경 가능)


ALTER SYSTEM SET UNDO_TABLESPACE = 새로생성된undotablespace이름 ;


undo_retention 도 가능


주의!

pfile을 사용할 경우, 이 작업이 끝난 후 반드시 파라미터 파일 내용도 같이 변경해야 DB OPEN 될 수 있음




3.Undo Tablespace 삭제


DROP TABLESPACE 기존undotablespace이름 ;






주요 파라미터들


UNDO_MANAGEMENT -> AUM인지 MUM 인지 확인

UNDO_TABLESPACE -> Undo Tablespace 조회

UNDO_RETENTION -> commit 수행 후에 해당 Undo Segment내의 데이터를 다른 서버 프로세스가 덮어 쓰지 못하도록 일정 시간을 설정

  ORA-01555 Snapshot too old 라는 에러를 해결하기 위한 방법이다.

UNDO_RETENTION_GUARANTEE -> 여분의 Undo Segment가 없을 경우UNDO_RETENTION 설정이 무시된다. 

   UNDO_RETENTION_GUARANTEE 파라미터를 설정된 시간동안  Undo Segment을 재활용 하지 않고 데이터를 지켜줌 

   조회:

   SELECT tablespace_name, retention from dba_tablespace ;

   방법:

   ALTER TABLESPACE 이름 RETENTION GUARANTEE ; <- guarantee 설정

   ALTER TABLESPACE 이름 RETENTION NOGUARANTEE ;  <- guarantee 취소



주요 명령어

현재 UNDO 상태 파악 

ㄴ SHOW PARAMETER UNDO ;


전체 DATA FILE 정보보기

ㄴ SELECT tablespace_name, bytes/1024/1024 MB, file_name FROM DBA_DATA_FILES ;


UNDO TABLESPACE 목록보기

ㄴ SELECT segment_name, owner, tablespace_name, status FROM DBA_ROLLBACK_SEGS ;


각 세션별로 사용하는 Undo Segment 확인

p309




'오라클 ADMIN' 카테고리의 다른 글

Index  (0) 2013.01.20
Table  (0) 2013.01.20
Data Block, Extent, Segment  (0) 2013.01.16
Control File, Redo Log File, Data File 관리 연습  (0) 2013.01.16
Tablespace and Data Files  (0) 2013.01.15