Undo

과거에는 롤백 (Rollback)이 라는 용어를 주로 사용했지만, 9i부터 오라클 사는 공식 문서 에 Undo 라는 용어를 사용하고 있다 . 8i 버전까지는 롤백 세그먼트를 생성하고 ONLINE/OFFLINE 상태를 변경하는 등의 작업을 DB 관리자가 직접 했다. 

 

또한, 대용량 트랜잭션 처리를 위해 사용할 롤백 세그먼트를 가끔 수동으로 변경해 주는 등의 작업을 하기도했다.


9i부터 AUM(Automatic Undo Management) 기능이 도입되면서 그런 수동 작업이 불필요해져 Undo 세그먼트 개념을 많이 생소하게 느끼는 것 같다. Undo 세그먼트가 일반 세그먼트와 많이 다르다고 생각할 수 있지만, Undo 세그먼트는 구조적으로 볼 때 데이터를 저장하는 일반 테이블 세그먼트와 별반 다르지 않다.

 

테이블 세그먼트와 마찬가지로 익스텐트(Extent) 단위로 확장되고,빠른 읽기/쓰기를 위해 Undo 블록들을 버퍼 캐시에 캐싱하며,데이터 유실을 방지하기 위해 그 변경사항을 Redo 로그에 로깅하는 점도 같다.

 

다른 점이라면 Undo 세그먼트에 저장하는 내용인데 각 트랜잭션 별로 Undo 세그먼트를 할당해 주고(두 개 이상의 트랜잭션이 하나의 Undo 세그먼트를 할당받아 같이 사용할 수 있음) 그 트랜잭션이 발생시킨 테이블과 인덱스에 대한 변경사항들을 Undo 레코드 단위로 Undo 세그먼트 블록에 차곡차곡 기록한다.

 

 

 

오라클 8i 이전에는 Undo 세그먼트를 데이터베이스 관리자가 수동으로 관리했고,rollback_segments  파라미터에 의해 그 개수도 고정적이었다.

 

9i에서는 AUM(Automatic Undo Management)이 도입되어 Undo 세그먼트마다 하나의 트랜잭션이 할당되는 것을 목표로 세그먼트 개수를 오라클이 자동 관리한다.

 

트랜잭션에 독립적으로 할당해 줄 Undo 세그먼트가 없을 때는{Online으로 전환할 수 있는 αfline 세그먼트가 없고 새로운 Undo 세그먼트를 생성할 공간도 부족할 때) 8i에서처럼 가장 적게 사용되는 Undo 세그먼트 중 하나를 할당한다.


그리고 예전에는 할당받은 Undo 세그먼트를 더 이상 확장할 수 없을 때 곧바로 ORA-01562 에러를 만났지만 AUM에서는 다른 Undo 세그먼트로부터 Free Undo Space를 가져올 수 있으며(Dynamic Extent Transfer), Undo 테이블스페이스 내에 있는 모든 Undo Space를 소진했을때 비로소 에러를 발생시킨다.

 

 

Undo 세그먼트에 저장된 정보는 아래 3가지 목적을 위해 사용한다.


1. Transaction Rollback
2. Transaction Recovery (Instance Recovery 시 rollback 단계)
3. Read Consistency

 

첫째, 트랜잭션에 의한 변경사항을 최종 커빗하지 않고 롤백하고자 할 때 Undo 데이터 를이용한다.

 

둘째, 앞서 Redo에서 설명했듯이 Instance Crash 발생 후 Redo를 이용해 Roll forward 단계가 완료되면 최종 커밋되지  않은 변경사항까지 모두 복구된다. 따라서 시스템이 섯다운된 시점에 아직 커빗되지 않았던 트랜잭션들을 모두 롤백해야 하는데, 이때  Undo 세그먼트에 저장된 Undo 데이터를 사용한다.


마지막으로, Undo 데이터는 읽기 일관성(Read Consistency)을 위해 사용되는데, 본서는 SQL 튜닝 원리를 설명하는 책이므로 이 부분이 가장 중요한 관심사항이다.

 

 

DB2, SQL Server, Sybase 등은 Lock을 통해 읽기 일관성을 구현하지만, 오라클은 Undo 데이터를 이용해 임기 일관성을 구현한다. 다음 절 이하에서 아주 자세허 다룰 댄데, 오라클만의 독특한 읽기 일관성을 이해하려면 지금부터 설명하는 Undo 메커니즘에 대한 이해가 필수적이다.

'데이터 아키텍처 & 처리기술 & DBMS > Oracle' 카테고리의 다른 글

테이블 레벨 Lock 읽기 일관성 확보  (0) 2023.12.21
문장수준 읽기 일관성  (0) 2023.12.21
Oracle Undo 세그먼트 구조  (0) 2023.12.21
Block-Level Lock  (0) 2023.12.21
Lock Byte  (0) 2023.12.21