전문가를 위한 오라클 데이터베이스 아키텍처 (2014년)
언두란 무엇인가? 0 0 84,292

by 구루비스터디 리두 언두 REDO UNDO [2018.09.27]


  • 언두(Undo) : 리두(redo) 와 반대 개념
  • 변경이 일어나기 이전 상태로 데이터를 되돌릴 수 있도록 데이터 변경 시 생성되는 정보.
  • 데이터베이스에 언두 세그먼트로 알려진 세그먼트의 특정 집합에 내부적으로 저장된다.
  • 롤백 세그먼트 = 언두 세그먼트 같은 뜻이다.
  • DBA 는 수동 언두 관리 방식으로 롤백 세그먼트를 생성할 수 있다.
  • 자동 언두 관리 방식(oracle 9i~) 에서는 언두 세그먼트를 필요한 만큼 생성하고 제거한다.
  • 언두를 사용하면 논리적으로 과거 모습 그대로 복원하는 것.
    • 동시 트랜잭션이 많은 다중 사용자 시스템에서는 롤백 후 데이터 구조, 데이터베이스 블록과 같은 물리적 요소는 달라질 수 있다.
  • direct path 작업 시 언두를 생성하지 않는다.


  • 빈 테이블을 생성한다.

SQLPLUS > create table t as select * from all_objects where 1=0 ;

Table created.



  • 빈 테이블을 전체 스캔하고 발생한 I/O 양을 관찰.


SQLPLUS >set autotrace traceonly statistics
SQLPLUS >select * from t ;

no rows selected


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
...
SQLPLUS >set autot off


  • 테이블에 로우를 많이 삽입한다. (커밋은 하지않음). 이후 작업을 롤백하고 테이블을 언두한다.

SQLPLUS >insert into t select * from all_objects ;

22856 rows created.

SQLPLUS > rollback ;

Rollback complete.



  • 다시 테이블을 전체 스캔하고 발생한 I/O 양을 관찰한다.

set autotrace traceonly statistics
SQLPLUS >select * from t ;

no rows selected


Statistics
----------------------------------------------------------
         10  recursive calls
          1  db block gets
        381  consistent gets       <--------------
          0  physical reads
...
SQLPLUS >set autot off



  • INSERT 로 인해 테이블 최고 수위점 (HWM) 아래 추가된 블록은 포맷상태로 비어있다.
  • 전체 스캔 시 블록에 로우가 있는지 확인하기 위해 해당 블록을 읽어야만 한다.


  • 예제에서 첫 번째 select 시 I/O 가 0 인 이유
    • 11gR2 부터 테이블 생성 시 세그먼트 생성이 연기되는 기본설정값이 변경됨.


  • "rollback 을 해도 물리적인 공간까지 이전상태로 되돌아 가는 것은 아니다" 를 테스트

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE


SQLPLUS > create table t ( x int ) segment creation deferred ;

Table created.


SQLPLUS > select extent_id, bytes, blocks
from user_extents 
where segment_name ='T'
order by extent_id ; 

no rows selected

SQLPLUS >insert into t (x) values (1) ;

1 row created.

SQLPLUS >rollback ;

Rollback complete.

SQLPLUS >select extent_id, bytes, blocks
from user_extents
where segment_name ='T'
order by extent_id ;
  2    3    4

 EXTENT_ID      BYTES     BLOCKS
---------- ---------- ----------
         0      65536          8



  • 세그먼트는 INSERT 에 의해 만들어지나, ROLLBACK 한다고 해서 그 공간이 해제되지 않는다.
  • 새롭게 포맷된 블록은 두 번째로 스캔되는 시점에 INSERT 에 의해 생성되는 것이다.
  • 그러므로 언두 작업은 논리적인 측면에서 데이터베이스를 이전 상태로 되돌리는 작업이다.
"데이터베이스 스터디모임" 에서 2014년에 "전문가를 위한 오라클 데이터베이스 아키텍처 " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4025

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입