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