Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-12
제목 ROLLBACK SEGMENT 관리(7~8i)
ROLLBACK SEGMENT 관리
=====================

롤백 세그먼트는 다른 세그먼트처럼 익스텐트로 구성되어 있다. 롤백
세그먼트는 이들 익스텐트를 Circular 하게 이용한다. 하나의 트랜잭션은 롤백
세그먼트의 Current Pointer 위치에 레코드를 기록하고 Current Pointer를
레코드 크기만큼 증가시킨다. 롤백 세그먼트에 레코드가 기록되는 현재 위치를
Head 라고 부르기로 한다. 그리고 롤백 세그먼트 상에서 가장 오래된
트랜잭션 레코드의 시작 위치를 Tail 이라고 부르기로 한다.

트랜잭션들이 필요로 할 때 마다 롤백 세그먼트를 사용할 수 있도록 적절한
갯수의 롤백 세그먼트를 유지해야 하며 각각의 롤백 세그먼트는 트랜잭션
부하를 감당하도록 충분한 크기를 가져야한다.

<롤백 세그먼트의 갯수와 크기>

롤백 세그먼트가 사용되는 방법은 다음과 같다.

1. 하나의 트랜잭션은 하나의 롤백 세그먼트 만을 사용한다.
2. 롤백 세그먼트의 Head는 Tail 에 의해서 사용되는 익스텐트를 침범하지
않는다.
3. 링 형으로 구성된 롤백 세그먼트 안에 더 이상 할당할 익스텐트가 없으면
새로운 익스텐트가 할당되어 링 안에 포함된다.
따라서 롤백 세그먼트의 크기를 적절히 유지하는 것은 매우 중요하다.
롤백 세그먼트의 적절한 크기는 데이타베이스에서 수행되는 트랜잭션의
활동 상태에 따라서 달라진다. 필요한 롤백 세그먼트의 갯수는 현재의
롤백 세그먼트 사용 상태를 모니터 해서 결정한다.

롤백 세그먼트의 적절한 크기와 갯수를 결정하는 것은 다음
테스트 과정을거쳐서 결정한다.

1. 롤백 세그먼트를 저장할 테이블 스페이스 생성
2. 테스트할 갯수의 롤백 세그먼트를 1)에서 만든 테이블 스페이스에 생성
3. 롤백 세그먼트의 익스텐트 크기는 모두 동일하게 설정. 익스텐트 크기는
세그먼트가 최대로 확장되었을 때 10~30 개 정도가 되도록 한다.
4. 롤백 세그먼트의 Minextent 는 2 이상.
5. 테스트할 롤백 세그먼트의 Status 를 In Use 상태로 변경하여 활성화
시킨다
6. 애플리케이션을 실행한다
7. 롤백 세그먼트 Contention을 측정한다.
8. 롤백 세그먼트의 최대 확장 상태를 측정한다.

테스트 과정에서 가장 큰 상태가 될 때의 롤백 세그먼트 크기를 Minimum
Coverage Size 라고 하자. 만약 Contention 이 발생하면 롤백 세그먼트의
갯수를 늘려가면서 테스트를 반복한다.

<익스텐트의 갯수와 크기>

롤백 세그먼트의 익스텐트 크기는 모두 같고 롤백 세그먼트가 포함된 테이블
스페이스의 크기는 익스텐트 크기의 정수배인 것이 바람직하다. 롤백
세그먼트의 일반적인 크기는 20개 정도의 익스텐트가 적합하다.

<오라클7 에서의 기능>

오라클7에서는 롤백 세그먼트의 pctincrease 는 항상 0이다. optimal
값을지정하면 오라클은 롤백 세그먼트를 항상 이 크기 이하로 유지하려고 하게
된다. 이와같은 Shrinking은 롤백 세그먼트의 Head 가 하나의 익스텐트에서
다음 익스텐트로 넘어갈 때 일어난다. 오라클은 가장 오래된 비활성 상태의
익스텐트 부터 제거하여 Shrink 한다.

롤백 세그먼트 모니터에서 롤백 세그먼트에 할당되었던 최대 익스텐트와
Optimal, Shrink 횟수 등이 나타나는데 여기서 적절한 Optimal 값을 결정할
수 있다.

오라클7 에서는 동적으로 롤백 세그먼트의 Online/Offline이 가능하다. 롤백
세그먼트가 처음 생성되었을 때는 Offline 상태이므로 이것을 Online 상태로
만들려면 Alter Rollback Segment 명령을 Online 옵션으로 사용하거나
init.ora 화일에 해당 롤백 세그먼트를 등록하고 데이타베이스를
Restartup 하면 된다. 반대로 Alter Rollback Segment 명령을 이용하여
Offline 시킬 수도 있다. Offline 된 롤백 세그먼트를 Online 시키려면 Alter
Rollback Segment 를 이용하거나 init.ora 의 rollback_segments 에
지정을 하고 데이타베이스를 Restartup 해야 한다.


<롤백 테이블 스페이스의 디자인>

트랜잭션에 의해서 발생되는 롤백 정보의 크기는 다음의 스크립트를 이용하여
추정할 수 있다.


set feedback off
set termout off
column name format A40
define undo_overhead=54
DROP TABLE undo$begin;
DROP TABLE undo$end;
CREATE TABLE undo$begin ( writes number );
CREATE TABLE undo$end ( writes number );
INSERT INTO undo$begin
SELECT sum(writes) FROM v$rollstat;
set termout on
set feedback on
UPDATE test1 SET col1=99 WHERE col3 ='Y';

set termout off
set feedback off
INSERT INTO undo$send
SELECT sum(writes) FROM v$rollstat;
set termout on
set feedback on
SELECT ( ( e.writes - b.writes) - &undo_overhead)
" number of bytes generates"
FROM undo$begin b, undo$end e;
set termout off
set feedback off
DROP TABLE undo$begin;
DROP TABLE undo$end;

위의 스크립트가 출력하는 결과는 트랜잭션 동안 발생하는 UNDO 이다.
따라서 데이타베이스에 다른 트랜잭션이 없다면 이 값은 정확한 값을 보여준다.

아래의 스크립트는 활성화된 트랜잭션을 실행하는 유저와 각 트랜잭션이
사용 중인 롤백 세그먼트를 보여준다.


SELECT r.name "ROLLBACK SEGMENT NAME ",
l.sid "ORACLE PID",
p.spid "SYSTEM PID ",
NVL ( p.username , 'NO TRANSACTION' ),
p.terminal
FROM v$lock l, v$process p, v$rollname r
WHERE l.sid = p.pid(+)
AND TRUNC (l.idl(+)/65536) = r.usn
AND l.type(+) = 'TX'
AND l.lmode(+) = 6
ORDER BY r.Name

여러가지 경우에 대해서 알아보자.

1. 보통의 트랜잭션인 경우

롤백 테이블 스페이스의 크기는 앞에서 결정한 롤백 세그먼트들이 Minimun
Coverage Size인 경우와 거의 같은 크기로 설정한다. 롤백 세그먼트를 생성
할 때 필요한 크기를 모두 할당받도록 한다. 따라서 롤백 세그먼트를
만들고 나면 테이블 스페이스에 더 이상의 빈 공간은 남지 않게 된다.


2. 매우 크고 자주 발생하는 트랜잭션인 경우

이 경우에는 다른 롤백 세그먼트들보다 큰 롤백 세그먼트를 하나 만들어서
큰 트랜잭션이 사용하도록 한다. 예를 들어 가장 큰 트랜잭션의 크기가 45M
이고 minimum coverage size 가 10M 라면 큰 롤백 세그먼트의 크기는 55M 가
된다. 다른 롤백 세그먼트들은 Minimum Coverage Size 로 생성된다. 큰 롤백
세그먼트를 사용하고자 할 때에는 Set Transaction Use Rollback Segment 를
사용하여 지정한다. 만약 큰 트랜잭션이 여러 개가 동시에 발생하면 큰
롤백 세그먼트도 여러 개가 필요하다.


3. 매우 크지만 자주 발생하지는 않는 트랜잭션인 경우

이 경우에는 큰 트랜잭션을 위한 큰 롤백 세그먼트를 하나 만들되 필요한
경우에만 만들어서 사용하고 사용이 끝나면 삭제하는 방법을 사용한다. 아니면
아예 별도의 롤백 테이블 스페이스와 큰 롤백 세그먼트를 만들어서 작업 중에
사용하고 작업이 끝나면 삭제하여도 된다.
실제로는 위와 3가지 경우가 복합되어 발생하므로 상황에 따른 적절한 대응이
필요하다.

<오라클 V7>

오라클 V7에서는 여러가지 기능이 추가되어서 롤백 세그먼트의 설계가
달라진다. Optimal 값을 설정하면 좋은 점도 있지만 그 값이 너무 작다면
익스텐트의 할당과 Deallocation 이 빈번히 발생하여 performance의 저하를
가져올 수도 있다. 그리고 언제 롤백 세그먼트가 Optimal 크기로 돌아갈지를
예측할 수 없다는 점도 문제이다.

1. 보통의 트랜잭션인 경우

V6 의 경우와 같다. 단지 테이블스페이스에 여유 공간을 둘 경우 Optimal을
설정하여 초기에 설정한 값을 유지하도록 한다. Optimal 값은 Minimum
Coverage Size 보다 작게 주면 performance가 저하되므로 유의하도록 한다.


2. 매우 크고 자주 발생하는 트랜잭션인 경우

여기서 자주 발생한다는 것은 모든 롤백 세그먼트가 optimal 크기로
돌아가기 전에 또다시 큰 트랜잭션이 발생한다는 의미이다.
( 큰 트랜잭션이란 이것이 발생시키는 롤백 정보를 담을 롤백 세그먼트를
만들 수 없는 것을 말한다. 이 경우에는 Optimal 은 해결방법이 되지
못한다. 해결방법으로는 우선 롤백 세그먼트의 갯수를 줄여서 각각의 롤백
세그먼트가 충분히 커질 수 있도록 하는 것이다. 하지만 이렇게 하면
Contention 이 일어나서 퍼포먼스가 저하될 수 있다. 다른 방법은 큰 롤백
세그먼트를 만들어서 Set Transaction Use Rollback Segment 명령으로
해당 트랜잭션이 이것을 지정하여 사용하도록 하는 방법이다. 하지만, 이
방법은 애플리케이션에서 롤백 세그먼트를 지정하는 명령을 사용할 수
있어야만 사용 가능하다.


3. 매우 크지만 자주 발생하지 않는 트랜잭션인 경우

롤백 테이블 스페이스를 롤백 세그먼트들의 Minimum Coverage Size를 큰
트랜잭션의 정보를 담을 만한 크기로 만든다. 그리고 모든 롤백 세그먼트의
Optimal 을 Minimum Coverage Size 로 설정한다. 그렇게 하면 큰 트랜잭션이
어느 롤백 세그먼트에 할당되어도 완전한 처리가 가능해진다.
다음의 큰 트랜잭션이 들어올 때 쯤이면 optimal 설정에 의해서 필요한
공간을 항상 보유하고 있게 된다. 하지만 optimal 설정에 따른 약간의
performance 저하가 발생할 수도 있다.

from Technical Bulletin (Korean)
Comment
등록된 코멘트가 없습니다.