by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

14S_언두란 무엇인가?




  • 언두(Undo) : 리두(redo) 와 반대 개념
  • 변경이 일어나기 이전 상태로 데이터를 되돌릴 수 있도록 데이터 변경 시 생성되는 정보.
  • 데이터베이스에 언두 세그먼트로 알려진 세그먼트의 특정 집합에 내부적으로 저장된다.
  • 롤백 세그먼트 = 언두 세그먼트 같은 뜻이다.
  • DBA 는 수동 언두 관리 방식으로 롤백 세그먼트를 생성할 수 있다.
  • 자동 언두 관리 방식(oracle 9i~) 에서는 언두 세그먼트를 필요한 만큼 생성하고 제거한다.
  • 언두를 사용하면 논리적으로 과거 모습 그대로 복원하는 것.
    • 동시 트랜잭션이 많은 다중 사용자 시스템에서는
      롤백 후 데이터 구조, 데이터베이스 블록과 같은 물리적 요소는 달라질 수 있다.
  • direct path 작업 시 언두를 생성하지 않는다.
  1. 빈 테이블을 생성한다.
    SQLPLUS > create table t as select * from all_objects where 1=0 ;
    
    Table created.
    
    
  2. 빈 테이블을 전체 스캔하고 발생한 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
    
  3. 테이블에 로우를 많이 삽입한다. (커밋은 하지않음). 이후 작업을 롤백하고 테이블을 언두한다.
    SQLPLUS >insert into t select * from all_objects ;
    
    22856 rows created.
    
    SQLPLUS > rollback ;
    
    Rollback complete.
    
    
  4. 다시 테이블을 전체 스캔하고 발생한 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 에 의해 생성되는 것이다.
  • 그러므로 언두 작업은 논리적인 측면에서 데이터베이스를 이전 상태로 되돌리는 작업이다.

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.