Oracle Admin 강좌 (Oracle9i)
Undo Segment란? 7 19 21,627

by 김정식 UNDO SEGMENT ROLLBACK SEGEMENT TRANSACTION ROLLBACK SET TRANSACTION READ ONLY [2005.04.14]


Rollback 세그먼트와 Undo 세그먼트의 관계

  - RollbackUndo는 기본적으로는 동의어 입니다.

  - Oracle 9i 이전엔 Rollback Segement라는 용어를 사용했는데, Oracle 9i 이후버전 부터는 Undo Segment라는 용어를 사용합니다.

  - Rollback(Oracle 9i 이전 버전) = Undo(Oracle 9i 이후 버전)

  - Undo 세그먼트는 관리 방식에 있어서 9i 이후 버전에서 자동 관리 모드와 수동 관리 모드를 선택 할 수 있는 기능이 추가 되었고, 트랜잭션 처리를 위한 알고리즘이 개선되었습니다.

  - Undo 세그먼트는 생성, 할당 및 튜닝을 오라클 서버가 관리하므로 DBA는 더 이상 몇개의 Rollback 세그먼트를 생성 할 것인지, 크기는 어떻게 할 것인지, 트랜잭션에 따라 어떻게 할당할 것인지를 결정하지 않아도 됩니다.

Undo 세그먼트의 목적

  - Undo SegmentsTransaction Rollback, 일기 일관성 유지(Read Consistency), Transaction Recovery를 위해 존재 합니다.

  - Transaction Rollback이란 Oracle 서버에서 Undo Segment에 저장된 값을 이용해서 원래의 값으로 복원하는 기능을 말합니다. Transaction Rollback이 실행되는 경우는 사용자가 Rollback command를 실행하거나, Transaction이 비정상 종료되어 PMON이 자동 Rollback 처리하는 경우 입니다.

  - 읽기 일관성이란 Transaction이 진행되는 동안 Database의 다른 사용자는 이 Consistent Read에 의해 Commit되지 않은 변경 사항을 볼 수 없는 기능 입니다.

  - Transaction Recovery는 Transaction이 진행되는 동안 Instance가 실패한 경우 Database가 다시 열릴 때 Commit 되지 않은 사항은 Rollback 되어야 하는데 이때 Undo Segment 정보가 사용 됩니다. Undo Segment의 변경사항은 리두로그 파일로 보호되므로 복구가 가능 합니다.

Undo 세그먼트의 종류

1) SYSTEM

  시스템 테이블스페이스에 존재하는 객체에서 사용

2) Non-SYSTEM

  시스템 테이블스페이가 아닌 다른 테이블스페이스에 존재하는 객체에서 사용

  Auto Mode : 지정된 Undo 테이블스페이스에서 자동 생성 관리됨

  Manual Mode
    가) Private : 하나의 인스턴스에만 독점적으로 사용 가능
    나) Public : 다중 인스턴스환경에서 어떤 인스턴스라도 사용 가능(OPS 또는 RAC 환경)

Deferred

  테이블스페이스를 offline immediate 명령으로 offline 시켰거나, recovery가 진행 중일 때 사용

- 강좌 URL : http://www.gurubee.net/lecture/1868

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 손님 [2008.12.19 16:59:18]
Undo Segments는 디스크에 존재하나요? 메모리에 존재하나요?
테이블 스페이스란 말이 나오니까 디스크입니까?
그러면 메모리에는 남겨 놓지 않고 바로 디스크에 기록하나요?

by 장태길 [2008.12.19 22:23:06]
Undosegment 는 undo tablespace 에 존재하지만
다른 tablespace 와 마찬가지로 read/write 하기 위해서는
data buffer cache 에 올려다가 읽고/씁니다.

by 손님 [2008.12.22 10:40:41]
그러면 메모리에서 디스크로 쓰는 시점은 언제인가요?

by 장태길 [2008.12.22 11:24:39]
일반 db writer 시점하고 마찬가지입니다.
undo tablespace 입니다. tablespace 의 한종류죠
일단 유저들이 사용하는 tablespace 와 같은 종류 지만
undo 를 위해서만 사용되는 undo tablespace 입니다.
일반 tablespace 와 마찬가지로 buffer cache 를 통해서 i/o 가 발생하고,
db write 되는 시점은 마찬가지입니다.

by 손님 [2008.12.22 14:07:47]
그러니까 그 구체적인 시점이 언제입니까?

by 장태길 [2008.12.22 16:17:39]
강좌에서 db writer 로 검색 하시면
=================
③ DBWn(Database Writer)

◈ 버퍼 캐시에 있는 수정된(Dirty) 버퍼의 내용을 데이터 파일에 기록 합니다.


◈ DBWn는 데이터베이스 버퍼 캐쉬로부터 데이터 파일로 더티 버퍼(dirty buffer)를 옮겨 적습니다.
이렇게 함으로써 데이터베이스 버퍼 캐쉬 내에 충분한 수의 프리 버퍼(free buffer)가 사용 가능
하게 됩니다.

◈ 최근에 사용되지 않은 데이타 블럭부터 디스크에 쓰여지는 LRU 알고리즘을 사용합니다.


☞ DBWn이 발생하는 이벤트

- 더티 버퍼 수가 임계값에 도달 했을 때
- 프로세스가 지정된 갯 수의 블록을 스캔 하고도 Free Buffer를 하나도 발견하지 못했을 때
- 시간이 초과 했을 때 --> 3초 동안 작업이 중단 될 때(A time-out occurs)
- Checkpoint 가 발생했을때
- RAC ping이 요청 되었을 때
- Tablespace가 offline이나, read only로 변경 되었을 때
- Table을 DROP하거나 TRUNCATE 했을 때
- Tablespace BEGIN BACKUP 명령을 실행 했을 때

by 손님 [2008.12.22 17:14:53]
답변 감사합니다.
그런데, 말씀하신 내용은 더티버퍼에 관련된 내용인 것 같은데,
언두 데이터도 더티 버퍼에 해당 됩니까? 언두 데이터는 수정한 내용이 아니라 원본 내용인데 말이죠.

by 장태길 [2008.12.22 17:36:19]
http://www.juliandyke.com/Presentations/Presentations.html#LogicalIO
에 가셔서 LogicalIO 에서 Consistent Reads 부분을 한번 읽어보세요
Oracle DBMS 에서 읽거 쓰는 부분에서는 항상 Buffer Cache 를 사용하는것을
알고 있습니다. [ 제가 아는 한 ] Undo 역시 Tablespace 이고, 읽고 쓰기 위해서는
항상 Buffer Cache 를 거쳐야 합니다.
원질문인 undo segment 는 디스크에 존재합니다.
undo tablespace 에 지정 하는 깃이고 최근은 auto 로 관리 하지만
8i 버전에서는 RBS 라는 Tablespace 생생허 undo segment 를
수동으로 생성 해서 관리 했으니까요?
참고로 redo 의 경우 복구를 위한 데이타 이고,
Undo 는 consistent read 를 위한 자료입니다.
한 자료가 변경 중인 시점에 필요하지요...해당 자료가 commit 이후에는
before image 가 필요 없겠죠, 그리고 복구에도 필요가 없겠죠.


Consistent Reads

by 손님 [2008.12.23 10:19:00]
답변 감사드리고, 좋은 싸이트 알려 주셔서 감사합니다.
Undo Segments는 디스크에 존재하고, 변경 중인 시점에 필요하니까 업데이트 시점에 디스크에 기록하겠네요. 항상 Buffer Cache를 거친다면 그냥 Buffer Cache 에 남겨두면 되지, 디스크에 기록하는 이유는 무엇인가요? 메모리를 효율적으로 사용하기 위해서 디스크에 기록하고 Buffer Cache의 언두 데이터는 지워버리나요?

by 웅 [2008.12.23 11:14:41]
db buffer cache가 무한정한 리소스가 아니고 또 많은 process가 사용하기 때문에 잘 나누어 써야되기 때문입니다.
만약 buffer 크기가 100M인데 변경해야할 big테이블의 크기가 1G라고 하면, 변경할 대상블록을 buffer에 한번에 담을 수 없으니 순차적으로 작업을 하고, 변경작업한 내용은 어디다가 보관을 해야할 겁니다 commit될때까지.. 그게 undo segment 입니다.
undo 블럭이 undo segmet에 기록되면 lruw에 기록되어 재사용할 수 있는 상태가되고 재사용할 수 있는 블럭으로 flag가 바뀝니다.
그러다가 다른 세션의 사용자가 commit전의 변경된 블록을 읽을때 buffer에 있으면 buffe에서 읽고 없으면 undo segment에서 다시 buffer로 undo블록을 올려서 consistent read가 가능하게합니다.

by 장태길 [2008.12.23 11:26:50]
buffer 를 두는것. 즉 Memory 를 두는 것은
가장 큰 이유는 Disk I/O 를 최소화 입니다.

by 장태길 [2008.12.23 11:29:37]
undo 역시 tablespace 인지라
undo segment 에 write 하기 위해서 buffer cache 를 가져오고,
변경 전 undo 정보를 buffer cache 에 기록 하고,
그 와중에 undo 정보가 필요한 경우와 안필요한 경우 [ commit 후/ commit 전 ]
그리고 buffer cache 가 againg out 된 경우와 buffer 내에 존재 하는 경우로
나누워 생각하시면 되겠네요

by 손님 [2008.12.23 17:05:26]
답변 감사합니다. 지금 예로 드신 부분이 언두 데이터가 클때를 예로 드신 것 같은데요. 언두 데이터가 작을 때도 무조건 디스크에 기록하나요? 언두 데이터가 작은데도 디스크에 기록한다면 그만큼 부하가 많이 걸릴텐데, 오히려 효율이 떨어지지 않나요? 그리고 만약에 언두 데이터를 그냥 메모리에 남겨 둔다면 언두 세그먼트는 메모리에 있다고 말할 수 있겠네요?

by 웅 [2008.12.24 16:30:41]
저도 님처럼 이 부분이 너무 혼란스러운적이 있어서 많이 자주 물어봤었습니다. ^^
제 예는 이해하시기 쉬우라고 순서를 제가 아는 한도내에서 적어본거에요..
DML했다고 무조건 segment로 내려가진 않습니다. 위에 태길님께서 DBWR가 동작하는 경우를 열거하셨죠.

제일중요한 대목은 태길님이 계속 이야기하시듯 disk(segment)에 쓰는 것은 DBWR이고 이 DBWR가 동작하는 방식은 undo블럭이나 data블럭이나 다르지 한다는것입니다.
바꾸어 이야기하자면 buffer cache에 몇가지 블럭타입(segment타입과 관련)이 있는데...이 블럭을 데이터파일에 내려쓰는 것은 무조건 DBWR의 일이고 이중 UNDO블럭은 특별처리해서 UNDO SEGMENT에 내려쓰게된다.. 이정도로 이해하시면 될 듯하네요..더 인터널한 부분은 문서를 찾아보시면 태길님이 알려주신 문서를 보시면 도움이 되시리라 생각됩니다.

by 손님 [2008.12.25 11:02:57]
답변 감사합니다. 그런데, Undo Segment로 무조건 내려가지 않는다는 말씀은 Undo데이터 크기에 따라서 디스크에 쓰고 안쓰고가 구분되나요?
그리고, 데이터 블럭은 커밋트 후 적혀 지지만, 언두 데이터는 업데이트 후 적혀 지는 거 아닌가요? 그러면 동작 방식은 같을지 몰라도, 동작 시점은 너무 다른 것 같은데요? 그렇나요?

by 웅 [2008.12.25 16:27:55]
데이터블록도 commit했다고 disk에 바로 쓰지않습니다.
select시의동작과 dml의 동작의 대략적인 순서를 좀 더 파악하실 필요가 있어보이네요.(오라클클럽 오프라인세미나1 세미나 자료를 보시면 도움이 되실듯 합니다.)
대략적인 이해를 하시고 더 구체적인 내용을 공부해보세요.

by 손님 [2008.12.25 18:52:39]
답변 감사합니다. 근데, 커밋트 후 "바로"란 말은 안했는데... 커밋트 후라는 말을 했습니다. 그렇다고 데이터 블럭을 디스크에 커밋트 전에 적지는 않지 않습니까? 그래서 커밋트 전에 적는 언두 블럭하고 동작 시점이 다르다는 말을 했습니다. 동작 시점이 다른게 맞는지 다시 질문해도 될까요? 그리고, 참고로 안타깝게도 회원가입을 안하면 세미나 자료를 볼 수 없네요.

by darkturtle [2008.12.25 19:21:29]
commit 은 redo buffer 의 내용이 redo file 에 write 입니다.
redo wirte 와 buffer write 가 발생하는 이벤트를 체크 해보세요
회원가입은 무료랍니다.
해피 크리스마스 :- )

by bosoa [2009.08.28 15:53:39]
손님이란분은 언두 세그먼트의 목적이 무엇인지를 이해 못하셔서 질문을 계속 하신것 같으네요.. 시간이 많이 지나서 이젠 알고 계시겠지만, 언두 세그먼트에는 커밋 시점 이전의 변경전 정보가 있습니다. 커밋하기 전이란건 아직은 데이터를 수정한 트랜잭션이 완료되지 않았다는 의미가 되고 따라서 변경전의 데이터를 다른 세션이 읽어야만 읽기의 일관성이 유지되기 때문에 변경전의 정보를 유지합니다.

사족을 달자면 언두 세그먼트의 이전정보가 쓰여진 시점에 어떤 보고서를 위한 시간이 많이 걸리는 쿼리를 실행시키고, 그 와중에 변경된 정보를 작업하던 쿼리가 커밋을 합니다. 이시점에 언두 세그먼트의 이전 데이터 정보는 다른 트랜잭션이 덮어쓸 수 있는 시점이 되고 위에서 실행한 긴 쿼리는 커밋 이전의 데이터를 사용하여 결과를 산출하게 되므로 덮어쓰여 질지도 모를 언두 정보를 읽으려고 합니다. 재수가 좋아서 먼저 읽으면 상관없지만, 만약에 다른 트랜잭션이 이전 정보가 쓰여진 언두 세그먼트의 블록을 덮어써버리면, 스냅샷 투 올드 (이전 데이터를 읽어서 일관성을 유지할 수 없음) 에러를 만나게 됩니다.
언두 세그먼트 자체에 유지하는 데이터라든가 쓰여지는 양 관리 방식 등은 강좌를 더 살펴보고 공부를 (이미 하셨겠지만 ) 해야했겠네요. ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입