5._Undo
2012.03.11 22:58
- Rollback = Undo
. 일반 Segment와의 공통점
-
Extent 단위로 확장
- Undo Block 들을 Buffer Cache에 Caching
-
Data 유실 방지를 위한 변경사항을 Redo Log에 Loging
. 차이
- Trasaction별로 Undo Segment 할당 (N:1)
- Trasaction이 발생시킨 Table과 Index에 대한 변경사항을 Undo Record 단위로 Undo Segment Block에 기록
. Undo의 목적
- Transaction Rollback -> 변경사항을 커밋하지 않고 롤백하고자 할때 이용
- Transaction Recovery -> Instance Recovery 시 트렌잭션들을 모두 롤백
- Read Consistenncy -> Undo를 통한 읽기 일관성 구현
(1) Undo 세그먼트 트랜잭션 테이블 슬록
TTS : Trasaction Table Slot
( Undo Segement )
-
트랜잭션ID :
-
USN# (Undo Segment Number) + Slot# (Slot number in undo segment) + Wrap#(Undo segment sequence number
-
트랜잭션 상태정보 : 슬롯을 할당받았고 있는가를 표시 (슬롯을 할당받으면 Active)
- 커밋 SCN(System Change Number) :
- 트랜잭션이 커밋될때 갱신되는 일련번호
-
Last UBA(Undo Block address) :
-
트랜잭션의 기록사항들을 가장 마지막 Undo 레코드 뒤에 계속 추가해 나가려고 유지하는 포인터
-
기타
. 트랜잭션 시작시
-
Undo 세그먼트에 있는 트랜잭션 테이블로 부터 SLOT 할당
- SLOT에 자신이 Active 상태임을 표시하고 갱신 시작 ( 할당 대기 : undo segment tx slot )
. DML 오퍼렌이션 별 Undo 레코드에 기록 되는 내용
- Insert : 추가된 레코드의 rowid
- update : 변경되는 컬럼에 대한 before image
- delete : 지워지는 로우의 모든 커럼에 대한 before image
. V$TRANSACTION VIEW 를 통해 확인가능
- Used_ublk : 현재 사용중인 Undo 블록 개수
- Usec_urec : 현재까지 기록한 Undo 레코드양
- 인덱스가 있는 테이블이면 인덱스 엔트리의 갱신 내용까지 값에 포함
. Undo 의 재사용
- Active 상탱의 트랜잭션이 사용하는 Undo 블록과 트랜잭션 테이블은 절대 재사용 되지 않음
- 사용자가 커밋해 트랜잭션이 완료 되면 트랜잭션 상태정보를 Committed로 변경하고 그 시점의 커밋 SCN을 트랜잭션 슬롯에 저장
------> 트랜잭션 슬롯과 Undo 블록들은 재사용 가능
- 가장 먼저 커밋된 트랜잭션 슬록부터 순차적으로 재사용
. Undo retention
- Trasaction이 완료 되어도 지정한 시간동안은 가급적 Undo 데이터를 사용하지 말라고 오라클에게 주는 힌트
- Undo Extent가 필요하면 Expired 상태의 Extent 부터 사용 but, 공간이 부족해지면 Unexpired상태의 Extent라도 재사용 가능
- -------> 10 g 부터는 retention guarrantee 기능을 설정하면 공간이 부족해 에러를 발생시키더라도 지정 시간 이내의
커밋된 Undo 정보는 재사용 하지 않음
(2) 블록헤더 ITL 슬롯
각 데이터 블록과 인덱스 블록 헤더에 위치
- ITL 슬록번호
- 트랜잭션ID (XID)
- UBA (Undo Block Address)
- 커밋 FLAG
- 커밋 SCN
. 트랜잭션 시작, 특정 레코드를 갱신시
- 블록 헤더로부터 ITL 슬록 확보
- 트랜잭션 ID를 기록하고 해당 트랜잭션이 ACTIVE 상태임을 표시
. ITL 슬롯부족시 트랜잭션이 블로킹 되는 현상을 최소화 할 수 있도록 3가지 옵션 재공
- Initrans : 처음 포맷시 블록헤더에 ITL 슬롯 몇개를 할당할지 결정
- Maxtrans : 확장시 할당할수 있는 ITL 슬롯 개수
- Pctfree : ITL 슬롯 할당용 예약 공간 ( 모두 사용 되면 LOCK 경합발생 )
(3) Lock Byte
. 오라클은 레코드가 저장되는 로우마다 그 헤더에 Lock Byte를 할당해 해당 로우를 갱신중인 트랜잭션의 ITL 슬롯번호 기록
. 레코드 갱신시
- 대상 레코드의 Lock Byte 가 활성화 되있는지 확인
- ITL 슬롯을 찾음
- 다시 그 ITL 슬롯을 가르키는 트랜잭션 테이블 슬롯 찾음
- 해당 트랜잭션 테이블 슬롯에 트랜적신이 Active 상태이면 완료될때까지 대기
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
66 | 부록 | 남송휘 | 2012.06.06 | 2425 |
65 | 8._IO_효율화_원리 | 운영자 | 2012.06.06 | 4119 |
64 | 3._Deterministic_함수_사용_시_주의사항 | 정찬호 | 2012.05.29 | 4086 |
63 | 2._Cursor_Sharing | 운영자 | 2012.05.28 | 5990 |
62 | 7._Result_캐시 | 운영자 | 2012.05.27 | 4156 |
61 | 3._Single_Block_vs._Multiblock_IO | 정찬호 | 2012.05.23 | 3959 |
60 | 2._Memory_vs._Disk_IO | 정찬호 | 2012.05.23 | 4166 |
59 | 1._블록_단위_IO | 정찬호 | 2012.05.22 | 3924 |
58 | 6장._IO_효율화_원리 | 정찬호 | 2012.05.22 | 3806 |
57 | 1._Library_Cache_Lock_Pin | 남송휘 | 2012.05.21 | 3962 |
56 | 6._RAC_캐시_퓨전 | 남송휘 | 2012.05.21 | 17527 |
55 | 5._Direct_Path_IO | 남송휘 | 2012.05.21 | 7550 |
54 | 4._Prefetch | 남송휘 | 2012.05.21 | 3593 |
53 | 8._PLSQL_함수_호출_부하_해소_방안 | 남송휘 | 2012.05.21 | 3455 |
52 | 5._Fetch_Call_최소화 [1] | 박영창 | 2012.05.15 | 4806 |
51 | 7._PLSQL_함수의_특징과_성능_부하 | 남송휘 | 2012.05.15 | 6640 |
50 | 6._페이지_처리의_중요성 | 남송휘 | 2012.05.15 | 3117 |
49 | 4._Array_Processing_활용 | 시와처 | 2012.05.14 | 3767 |
48 | 3._데이터베이스_Call이_성능에_미치는_영향 | 시와처 | 2012.05.13 | 3381 |
47 | 10._Dynamic_SQL_사용_기준 | 남송휘 | 2012.05.07 | 4275 |