• 언두(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 에 의해 생성되는 것이다.
  • 그러므로 언두 작업은 논리적인 측면에서 데이터베이스를 이전 상태로 되돌리는 작업이다.