ch01. 오라클 아키텍처
05. Undo
- 8i까지는 롤백(rollback)이라는 용어를 사용.
롤백 세그먼트를 생성하고 ONLINE/OFFLINE의 상태변경 등의 작업을 DB관리자가 수동으로 관리했고, rollback_segments 파라미터에 의해 개수 고정.
롤백 세그먼트를 더 이상 확장할 수 없을 때 곧바로 ORA-01562 에러 발생. - 9i부터 오라클사는 공식 문서에 Undo라는 용어를 사용.
AUM(Automatic Undo Management)기능 도입. Undo 세그먼트마다 하나의 트랜잭션이 할당되는 것을 목표로 세그먼트 개수를 오라클이 자동 관리.
트랜잭션에 독립적으로 할당해 줄 Undo 세그먼트가 없을 때는(Online으로 전환할 수 있는 Offline 세그먼트가 없고 새로운 Undo 세그먼트를 생성할
공간도 부족할 때)8i에서처럼 가장 적게 사용되는 Undo 세그먼트 중 하나를 할당.
Undo 세그먼트를 더 이상 확장할 수 없을 때 다른 Undo 세그먼트로부터 Free Undo Space를 가져 올 수 있으며(Dynamic Extent Transfer),
Undo 테이블스페이스 내에 있는 모든 Undo Space를 소진했을때 비로소 에러 발생. - Undo 세그먼트의 구조는 일반 테이블 세그먼트와 같다.(익스텐트 단위로 확장, 버퍼 캐시에 캐싱, 변경사항을 Redo로그에 로깅)
- 다른 점이라면 Undo 세그먼트에 저장하는 내용이다.
각 트랜잭션 별로 Undo 세그먼트를 할당(두 개이상의 트랜잭션이 하나의 Undo 세그먼트를 할당받아 같이 사용할 수 있음)해 주고
그 트랜잭션이 발생시킨 테이블과 인덱스의 변경사항들을 Undo 레코드 단위로 Undo 세그먼트 블록에 기록한다.
- Undo 세그먼트의 사용 목적
1) Transaction Rollback - 최종 커밋하지 않고 롤백하고자 할 때 Undo 데이터 이용.
2) Transaction Recovery (instance Recovery시 rollback 단계) - Instance Crash 발생 후 Redo를 이용해 Roll forward 단계가 완료되면 최종 커밋되지 않은
변경사항까지 모두 복구.
3) Read Consistency - 읽기 일관성을 위해 사용.(타DB는 Lock을 통해 읽기 일관성을 구현)
(1) Undo 세그먼트 트랜잭션 테이블 슬롯
1) 트랜잭션 ID (USN# + Slot# + Wrap# USN : Undo Segment Number)
2) 트랜잭션 상태정보(Transaction Status)
3) 커밋 SCN(->트랜잭션이 커밋된 경우)
4) Last UBA(Undo Block Address)
5) 기타
- Undo 세그먼트 중 첫 번째 익스텐트, 그중에서도 첫 번째 블록에는 Undo 세그먼트 헤더정보가 담긴다.(p.41 그림 1-12 참고)
- Undo 세그먼트 헤더에는 트랜잭션 테이블 슬롯(Transaction Table Slot)이 위치하며 각 슬롯에 기록되는 사항은 아래와 같다.
- 트랜잭션을 시작하려면 먼저 Undo 세그먼트에 있는 트랜잭션 테이블로 부터 슬롯을 할당 받아야 하며, 할당받은 슬롯에 자신이 현재 Active 상태임을 표시.
(트랜잭션 슬롯을 얻지 못해 이용 가능한 슬롯이 생기기를 기다릴 때 발생하는 대기 이벤트가 'undo segment tx slot') - 트랜잭션이 발생시키는 데이터 또는 인덱스 블록에 대한 변경사항은 Undo 블록에 Undo 레코드로서 하나씩 차례대로 기록된다.
Insert : 추가된 레코드의 rowid
Update : 변경되는 컬럼에 대한 before image
Delete : 지워지는 로우의 모든 컬럼에 대한 before image
v$transaction.used_ublk : 현재 사용 중인 Undo 블록 개수
v$transaction.used_urec : 현재까지 기록한 Undo 레코드 양 - 사용자가 커밋해 트랜잭션이 완료되면 트랜잭션 상태정보를 'committed'로 변경하고 그 시점의 커밋 SCN을 트랜잭션 슬롯에 저장. 이 트랜잭션 슬롯과 Undo 블록들은
다른 트랜잭션에 의해 재상용될 수 있다.(in a circular fashion - 가장 먼저 커밋된 트랜잭션 슬롯부터 순차적으로 재사용)
{info}
undo_retention : 9i에서 AUM이 도입되면서 생긴 파라미터.(강제성 없음)
Undo Extent의 모든 Extent 상태정보(active, unexpired, expired)를 Commit Time을 목록으로 관리(List)하면서 필요한 경우 expired 상태의 Extent부터 재사용.
alter tablespace undotbs1 retention guarantee:
retention guarantee : 10g부터 도입 되어 옵션이 설정되면 undo_retention으로 지정된 시간 이내에 커밋된 Undo 정보는 재사용하지 않는다.
Automatic Undo Retention Tuning : 시스템 상황에 따라 tuned_undo_retention 값을 오라클이 자동으로 계산.(이경우 undo_retentiion값은 최소값을 지정하는 역활)
(2) 블록 헤더 ITL 슬롯
- 각 테이터 블록과 인덱스 블록 헤더에는 ITL(Interested Transaction List)슬록이 있다.(p.45 그림 1-13 참고)
1) ITL 슬롯 번호
2) 트랜잭션 ID
3) UBA(Undo Block Address) : 변경 이전 데이터가 저장된 Undo 블록 주소, 읽기 일관성을 위해 CR Copy를 생성하기 위해 사용.
4) 커밋 Flag
5) Locking 정보
6) 커밋 SCN(트랜잭션이 커밋된 경우) - 특정 블록에 속한 레코드를 갱신하려면 먼저 블록 헤더로부터 ITL 슬롯을 확보하여 트랜잭션 ID를 기록하고 Active 상태임을 표시한 후에야 블록 갱신 가능.
initrans : 블록을 처음 사용하려고 처음 포맷할 때 블록 헤더에 ITL슬롯을 몇 개 할당할지를 결정하는 파라미터
maxtrans : 지정된 갯수 만큼 ITL 슬롯을 추가 할당(pctfree 영역에 할당)
(ITL 슬롯이 부족할 때 발생하는 대기 이벤트가 'enq:TX - allocate ITL entry')
(3) Lock Byte
- 코드가 저장되는 로우마다 그 헤더에 Lock Byte를 할당해 해당 로우를 갱신 중인 트랜잭션의 ITL 슬롯 번호를 기록해 둔다.(로우 단위(row-level) Lock)
- 로우 단위 Lock 과 트랜잭션 Lock(=TX Lock)을 조합하여 로우 Lock을 구현.
문서에 대하여
- 최초작성자 : 김종원
- 최초작성일 : 2009년 10월 23일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 (주)비투엔컬설팅에서 출간한 '오라클 성능 고도화 원리와 해법I'를 참고하였습니다.*