Akashic Records

PLT 1.3 롤백 세그먼트 (ROLLBACK SEGMENTS) 본문

오래된글/DataBase

PLT 1.3 롤백 세그먼트 (ROLLBACK SEGMENTS)

Andrew's Akashic Records 2018. 4. 17. 15:32
728x90

PLT 1.3 롤백 세그먼트 (ROLLBACK SEGMENTS)

롤백세그먼트는 롤백(취소)에 필요한 데이터들이 저장되는 세그먼트입니다. 사용자가 트랜잭션을 유발하는 SQL문 등을 사용하면 해당 트랜잭션의 내용이 롤백을 위해 데이터파일에 저장됩니다. 어떤 컬럼을 UPDATE 한 후 사용자가 데이터에 변경한 내용을 이전으로 되돌리고 싶다면 ROLLBACK 명령을 사용할 것입니다. COMMIT 명령을 사용하거나 내부적으로 COMMIT 이 발생하면 변경한 내용은 영구적으로 반영되고, 트랜잭션이 종료될 것입니다. 트랜잭션이 종료되면 롤백세그먼트에 저장되었던 데이터들은 더 이상 필요 없는 것들이 됩니다.


롤백세그먼트의 용도

용 도

내 용

트랜잭션 롤백

트랜잭션이 테이블 내의 행을 변경할 때 구 이미지(이전 데이터 값)가 ROLLBACK 시를 대비해서 롤백 세그먼트에 저장됩니다.

트랜잭션 복구

트랜잭션 수행 중에 인스턴스가 비정상적으로 종료한다면 오라클 서버는 다시 오픈시 커밋되지 않은 변경 사항을 롤백 해야 합니다.(SMON이 자동으로 복구를 수행함) 트랜잭션 복구라 불리는 이와 같은 롤백은 롤백 세그먼트에 가해진 변경 사항 역시 리두 로그 파일에 의해서 보호되어야만 가능합니다.

읽기 일관성

오라클 서버는 문장 수행도중 데이터가 어느 트랜잭션에 의해 수정되었을 경우라도 일관된 시점의 데이터를 볼 수 있도록 보장합니다. 즉, 트랜잭션이 수행되고 있을 때 다른 사용자는 이 트랜잭션이 커밋하지 않은 변경 사항은 볼 수 없습니다. 또한 일단 명령문이 실행된 후 다른 트랜잭션에 의해 커밋된 변경 사항도 볼 수 없어야 합니다. 롤백세그먼트에 저장된 변경되기 이전 값은 주어진 명령문에 대한 일관된 이미지를 질의자에게 제공하는데도 사용됩니다.


롤백세그먼트 종류

시스템 롤백 세그먼트

데이터베이스가 생성될 때 시스템테이블스페이스에 생성됩니다. 시스템테이블스페이스 내의 오브젝트(데이터 딕셔너리)에 가해진 변경사항만 기록합니다.


비 시스템 롤백 세그먼트

데이터베이스에는 최소한 하나의 비 시스템 롤백세그먼트가 필요합니다. 일반데이터가 저장되어 있는 테이블스페이스 내의 오브젝트에 가해진 변경사항을 기록하는데 사용됩니다. 비 시스템 롤백세그먼트에는 다시 전용(Private) 과 공용(Public) 롤백세그먼트로 구분됩니다.


  • 전용(Private) 롤백세그먼트

초기화 파라미터 파일에 명명하거나 온라인 상태로 바꾸는 명령어를 실행한 인스턴스만 사용하는 세그먼트 쉽게 생각해서 개인이 사용하기 위해서 만든 겁니다.


  • 공용(Public) 롤백세그먼트

데이터베이스에서 사용 가능한 롤백세그먼트 풀(자원공유에 사용)의 일부분입니다. 오라클 병렬 서버(ORACLE ParalleServer)에서 사용할 수 있습니다. 모두가 같이 사용하는 롤백세그먼트라고 생각하면 됩니다. 공용 롤백세그먼트의 경우 인스턴스가 시작될 때 필요한 롤백세그먼트 개수를 계산해서 자동으로 개수만큼 online 시킵니다.


롤백 세그먼트 생성

CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment_name

[TABLESPACE tablespace_name]

[STORAGE (

[ INITIAinteger [K|M] ]

[ NEXT integer [K|M] ]

[MINEXTENTS integer ]

[MAXEXTENTS (integer | UNLIMITED) ]

[OPTIMA(integer [K|M] NULL) ]

) ]


  • PUBLIC 옵션을 사용하면 Public 롤백세그먼트가 됩니다. 사용하지 않으면 기본값인 Private(전용) 롤백세그먼트가 됩니다.

  • MINEXTENTS 값은 순환적으로 사용되기 위해 2 이상으로 지정되어야 합니다.

  • 롤백세그먼트 생성시에는 PCTINCREASE를 설정할 수 없습니다. 항상 0이 됩니다.

  • OPTIMA값은 최소한 MINEXTENTS로 정의한 개수의 익스텐트만큼의 공간의 크기와 같아야 합니다.

  • OPTIMAL을 지정하면 익스텐트들이 사용된 후 자동으로 OPTIMAL의 크기만큼만 남기고 할당되었던 익스텐트들이 할당 해제됩니다.

  • OPTIMA값은 평균 트랜잭션에 필요한 공간을 생각해서 설정해야 합니다.

  • INITIA의 값과 NEXT 의 값은 같은 크기로 지정합니다. (모든 익스텐트가 동일한 크기를 갖도록 하기위함)

  • MAXEXTENTS 의 값에 UNLIMITED를 사용하지 마십시오. 예기치 못한 결과를 초래할 수 있습니다.

  • 롤백세그먼트는 별도의 테이블스페이스에 생성하십시오. 데이터 테이블스페이스를 사용하면 경합과 단편화가 발생합니다.

  • 생성된 롤백세그먼트의 초기상태는 OFFLINE 입니다. onLINE 시켜도 오라클을 종료 후 다시 시작하면 다시 OFFLINE으로 됩니다.


롤백 세그먼트를 온라인 상태로 만들기

ALTER ROLLBACK SEGMENT rollback_segment_name onLINE;


  • 데이터베이스 STARTUP시 롤백세그먼트를 온라인 상태로 만들려면 초기화 파라미터에 ROLLBACK_SEGMENTS=(rbs1,rbs2,.....)로 지정하면 됩니다.

  • 인스턴스가 온라인 상태로 할 수 있는 롤백 세그먼트의 개수를 지정하려면 MAX_ROLLBACK_SEGMENTS 파라미터를 사용하십시오.

  • 오프라인은 당연히 ALTER ROLLBACK SEGMENT rollback_segment_name OFFLINE; 입니다. 롤백세그먼트를 삭제하려면 먼저 OFFLINE 시켜야 합니다. OFFLINE 상태인 롤백세그먼트는 사용할 수 없습니다.


롤백 세그먼트 삭제

DROP ROLLBACK SEGMENT rollback_segment_name ;

오프라인 상태에서만 삭제가 가능합니다.


트랜잭션과 롤백세그먼트

트랜잭션이 시작되려면 롤백세그먼트가 할당되어야 합니다. 사용자는 다음 명령을 사용하여 트랜잭션에 특정 롤백 세그먼트를 사용할 수 있습니다. SET TRANSACTION USE ROLLBACK SEGMENT rollback_segment_name 이러한 요구가 없으면 오라클 서버는 가장 적은 수의 트랜잭션이 지정된 롤백세그먼트를 선택하여 할당해 줍니다. 트랜잭션은 현재의 익스텐트가 꽉 차면 다음 익스텐트로 옮겨가는 순서 지정 원형방식(ordered circular fashion) 으로 롤백세그먼트의 익스텐트를 사용합니다. 트랜잭션은 롤백 세그먼트의 현 위치에 레코드를 기록하고 레코드 크기 만큼 포인트를 이동시켜 나갑니다.


  • 서로 다른 트랜잭션이 같은 익스텐트를 사용할 수 있습니다.

  • 서로 다른 트랜잭션이 같은 익스텐트의 같은 블럭에 저장될 수는 없습니다.

  • 익스텐트를 사용하다 꽉 차면 다음 익스텐트로 이동합니다. 이 단계를 wrap 이라 부릅니다.


롤백세그먼트 생성시 스토리지절의 MINEXTENTS가 10 이였다면 초기에 10개의 익스텐트가 있다는 뜻입니다. 여기서 만약 8번 익스텐트를 트랜잭션이 사용하다 꽉차면 9번 익스텐트를 사용합니다. 만약 9번 익스텐트가 비어있지 않고 즉, 비활성화 상태가 아니었다면 새로운 익스텐트가 할당됩니다. 8번에서 다음 단계를 건너 띄어서 10번 익스텐트로 갈 수는 없습니다. 어떤 트랜잭션이 익스텐트를 계속 사용하다 마지막 익스텐트인까지도 꽉 채웠다면 다시 처음 익스텐트로 이동합니다. 이때도 처음 익스텐트가 비활성화 상태가 아니라면 새로운 익스텐트를 할당받게 됩니다.


롤백 세그먼트 정보 이용

1. 롤백 세그먼트 보기

SELECT SEGMENT_NAME,TABLESPACE_NAME,OWNER,STATUS FROM DBA_ROLLBACK_SEGS;

SEGMENT_NAME TABLESPACE_NAME OWNER STATUS

---------------- ------------------ ------- -------

SYSTEM SYSTEM SYS onLINE <= 시스템 세그먼트

RBS1 RBS PUBLIC onLINE <= 공용세그먼트 OWNER 컬럼이 PUBLIC 표기됨.

RBS2 RBS PUBLIC onLINE

RBS3 RBS PUBLIC onLINE

.........

....

RBS22 RBS SYS OFFLINE <= 전용세그먼트 OWNER 컬럼이 SYS 표기됨.


위에서 RBS22 OFFLINE 입니다. OFFLINE 롤백세그먼트에 대한 정보는 DBA_ROLLBACK_SEGS 에서만 있습니다.


2. 현재 인스턴스가 사용하고 있는 롤백 세그먼트에 대한 통계 얻기

SELECT n.name, s.extents, s.rssize, s.optsize, s.hwmsize, s.xacts, s.status FROM v$rollname n, v$rollstat s WHERE n.usn = s.usn ;

NAME EXTENTS RSSIZE OPTSIZE HWMSIZE

------------------------------ ---------- ---------- ---------- ----------

XACTS STATUS

---------- ---------------

SYSTEM 6 385024 385024

0 onLINE

_SYSSMU1$ 2 122880 122880

0 onLINE

_SYSSMU2$ 2 122880 122880

0 onLINE


컬럼

설명

USN

롤백 세그먼트 번호, 세그머트의 이름을 알려면 V$ROLLNAME.USN 과 조인시켜야 한다.

EXTENTS

롤백 세그먼트의 익스텐트 갯수

RSSIZE

바이트 단위로 나타낸 세그먼트의 현재 크기

XACTS

세그먼트를 사용중인 트랜잭션 갯수

OPTSIZE

OPTIMA값

HWMSIZE

High water mark, 세그먼트가 사용된 이후 최대로 많이 사용되었던 크기를 바이트 단위로 나타냄.

AVEACTIVE

시간에 대해 평균한 현재 활성 익스텐트의 크기.

STATUS

롤백 세그먼트의 상태( onLINE, PENDING OFFLINE, OFFLINE)

CUREXT

롤백세그먼트 헤드의 현재 익스텐트 위치

CURBLK

롤백세그먼트 헤드의 현재 블럭 위치


3. Blocking 트랜잭션 찾아내기

Blocking 트랜잭션이란 사용되지 않고 오랜 시간을 대기하고 있는 트랜잭션을 뜻합니다. 많은 빈 익스텐트가 있음에도 불구하고 롤백 세그먼트를 성장하게 만들어서 많은 공간이 낭비되게 되므로 찾아서 죽이든 살리든 해야 합니다. 다음 익스텐트를 사용하려할때 활성화 상태인 트랜잭션이 기록한 엔트리가 하나라도 있다면 이 익스텐트는 재사용될 수 없습니다. 또한 트랜잭션은 익스텐트를 건너 뛰어서 이동할 수 없기 때문에 추가 익스텐트를 할당하게 됩니다.

SELECT s.sid, s.serial#, t.start_time, t.xidusn, s.username

FROM v$session s, v$transaction t, v$rollstat r

WHERE s.saddr = t.ses_addr

AND t.xidusn = r.usn

AND (( r.curext = t.start_uext-1) OR

(( r.curext = r.extents-1) AND t.start_uext=0)) ;


쿼리 결과를 검토해서 트랜잭션을 종료할 수 있는지 아니면 SESSION을 KIL해야 하는지 확인해 보고 필요한 행동을 취하십시오. 테이블스페이스를 오프라인 상태로 만들때 활성 롤백 세그먼트를 포함하고 있다면 오프라인 상태로 만들 수 없습니다. 이때에는 테이블스페이스의 롤백 세그먼트를 점검하고, 롤백 세그먼트를 사용하고 있는 활성 트랜잭션을 찾아서 세션 ID 와 일련번호를 사용하여 필요하다면 세션을 종료시켜야 합니다.


728x90

'오래된글 > DataBase' 카테고리의 다른 글

PLT 2.3 View  (0) 2018.04.17
PLT 2.2 Index  (0) 2018.04.17
PLT 1.2 리두 로그 파일(Redo Log Files)  (0) 2018.04.17
Oracle User Defined Object을 이용한 Table Return Function  (0) 2018.04.17
Oracle 중요 Hint  (0) 2018.04.17
Comments