9i 에서의 언두세그먼트 관리

2010.05.12 08:20

조인상 조회 수:7371

원문 : http://www.ischo.net -- 조인상 // 시스템 엔지니어

Writer : http://www.ischo.net -- ischo // System Engineer in Replubic Of Korea

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

본문 : http://www.ischo.net -- 조인상 //시스템 엔지니어

+++++++++++++++++++++++++++++++++++++++++++++++++++++++


   
 
No. 12183

[ORACLE9I]AUM (AUTOMATIC UNDO MANAGEMENT)에서의 ROLLBACK/UNDO SEGMENT
=====================================================================

PURPOSE
---------

이 문서는 Oracle 9i new featuer인 Automatic Undo Managemet (AUM)을
어떻게 사용하는지를 설명하고, 일반적인 rollback segment와 관련된
Manual Undo Management와의 차이점을 간략히 설명한다.


Explanation
-----------

1.AUM 환경에서 Rollback/Undo Segment 관리

AUM은 9i new feature로 undo segment에 대한 관리를 자동화, 단순화시켜 준다.

DBA는 Oracle 7, Oracle 8, Oracle 8i에서와 같이 직접 rollback segment를
관리해 줄 수도 있고, DBMS가 자동으로 관리하도록 할 수도 있다.

Rollback segment 관리와 사용에는 두가지 모드가 있다.

    * AUTOMATIC
    * MANUAL

두 종류의 segment를 구분하기 위해, AUM이 enable 되었을 경우
ROLLBACK segment를 UNDO segment라고 부른다.

어느 경우이거나, rollback/undo segment는 트랜잭션이 실행되고
종료되는 데 반드시 필요하다. 이것은 어떤 방식이건 간에
rollback/undo segment가 디스크 상 및 데이터베이스 상에
존재하여야 한다는 것을 의미한다.


2. initSID.ora 파라미터


1) 데이터베이스가 undo segment를 자동으로 관리하도록 하기 위해서는
  UNDO_MANAGEMENT 값을 AUTO로 지정

    a. UNDO 테이블스페이스를 만들 경우, 데이터베이스에서 undo segment를
      자동으로 생성 관리
    b. UNDO 테이블스페이스를 ONLINE/OFFLINE으로 바꿀 경우, 해당
      테이블스페이스 내의 undo segment도 자동으로 ONLINE/OFFLINE으로
      변환
    c. UNDO 테이블스페이스를 drop 할 경우, 해당 테이블스페이스 내의
      undo segment도 자동 drop

    참고: UNDO 테이블스페이스에도 rollback segment를 만들 수는 있으나
    그렇게 하지 않는 것이 권고사항임.

  UNDO_MANAGEMENT 값을 MANUAL로 지정할 경우 rollback segment를
  수동으로 관리

2) AUM을 사용하기 위해서는 데이터베이스에 최소한 한개의 UNDO 테이블
  스페이스를 만들어 undo segment가 자동으로 만들어지도록 하여야 한다.
  필요 시 한개 이상의 UNDO 테이블스페이스를 만들 수 있으며, 이 경우,
  어떤 UNDO 테이블스페이스를 사용할지를 지정해 주어야 한다.

    UNDO_TABLESPACE=rbs

    SQL> select name,value from v$parameter
        where name in ('undo_management','undo_tablespace');

    NAME                      VALUE
    ----------                ------------------
    undo_management              AUTO
    undo_tablespace              RBS

  하나 이상의 UNDO 테이블스페이스를 사용할 경우, 작업
  특성에 따라 원하는 storage parameter로 테이블스페이스를 만들어
  사용할 수 있다. 예를 들어 OLTP 용 UNDO 테이블스페이스와 BATCH 용
  UNDO 테이블스페이스를 만들어, 필요 시 선택하여 사용하도록 할 수
  있다.


3. UNDO 테이블스페이스 생성

1) 데이터베이스 생성 시 UNDO 테이블스페이스 생성 가능
  <bulletin :12184> 참조.

2) 데이터베이스 생성 후 추가 방법

    SQL> create undo tablespace UNDO_RBS1
        datafile 'undorbs1.dbf' size 100m;
    Tablespace created.


4. UNDO 테이블스페이스 특성

1) 시스템 extent 할당 방식으로 local에서 관리

    SQL> select TABLESPACE_NAME, CONTENTS,
            EXTENT_MANAGEMENT, ALLOCATION_TYPE,
            SEGMENT_SPACE_MANAGEMENT
        from dba_tablespaces where contents='UNDO';

    TABLESPACE_NAME          CONTENTS  EXTENT_MAN ALLOCATION SEGMENT
    ------------------------------ --------- ---------- ---------- -------
    RBS                  UNDO    LOCAL    SYSTEM    MANUAL
    UNDO_RBS1              UNDO    LOCAL    SYSTEM    MANUAL


2) UNDO 테이블스페이스를 다른 목적 (일반 데이터 저장) 등의 목적
  으로 사용할 수 없으며, system이 생성한 undo segment를 제어할 수 없다.

    SQL> create table T (c number) tablespace undo_rbs1;
    create table T (c number) tablespace undo_rbs1
    *
    ERROR at line 1:
    ORA-30022: Cannot create segments in undo tablespace

    SQL> create rollback segment undo_rs1 tablespace undo_rbs1;
    create rollback segment undo_rs1 tablespace undo_rbs1
    *
    ERROR at line 1:
    ORA-30019: RBU Rollback Segment operation not supported in SMU mode


    참고 : UNDO 테이블스페이스에 rollback segment를 manual mode에서
        만들 수는 있으나, AUM 모드에서는 수동으로 만든 rollback
        segment를 사용할 수 없다.

3) 하나의 인스턴스는 한 시점에 하나의 UNDO 테이블 스페이스만 사용 가능

  => initSID.ora 파일에서 UNDO_TABLESPACE=rbs 지정 후 인스턴스 기동
  => SQL 문장으로 사용할 UNDO 테이블스페이스 지정
      SQL> alter system set undo_tablespace=undo_rbs1;
      System altered.



5. Rollback Segment 와 UNDO Segment 비교

1) UNDO 테이블스페이스 생성 시 생성되는 undo segment
  a. n undo segments ( SESSIONS 값으로 n 개의 undo segment 생성)
  b. undo segment의 이름은 _SYSSMUn$
  c. undo segment의 소유자는 PUBLIC (OPS 구성 시 유용)
  d. 수동으로 관리 불가

    SQL> select owner,segment_name,tablespace_name
        from dba_rollback_segs order by 3;

    OWNER  SEGMENT_NAME            TABLESPACE_NAME
    ------ ------------------------------------------------------------
    PUBLIC _SYSSMU1$              RBS
    PUBLIC _SYSSMU2$              RBS
    PUBLIC _SYSSMU3$              RBS
    PUBLIC _SYSSMU5$              RBS
    PUBLIC _SYSSMU7$              RBS
    PUBLIC _SYSSMU9$              RBS
    PUBLIC _SYSSMU10$              RBS
    PUBLIC _SYSSMU8$              RBS
    PUBLIC _SYSSMU6$              RBS
    PUBLIC _SYSSMU4$              RBS
    SYS  SYSTEM                SYSTEM
    PUBLIC _SYSSMU11$              UNDO_RBS1
    PUBLIC _SYSSMU12$              UNDO_RBS1
    PUBLIC _SYSSMU13$              UNDO_RBS1
    PUBLIC _SYSSMU14$              UNDO_RBS1
    PUBLIC _SYSSMU15$              UNDO_RBS1
    PUBLIC _SYSSMU16$              UNDO_RBS1
    PUBLIC _SYSSMU17$              UNDO_RBS1
    PUBLIC _SYSSMU18$              UNDO_RBS1
    PUBLIC _SYSSMU19$              UNDO_RBS1
    PUBLIC _SYSSMU20$              UNDO_RBS1


2) AUM 모드에서는 undo segment와 rollback segment 모두 제어
  할 수 없다. rollback segment가 UNDO 테이블스페이스가 아닌
  다른 테이블스페이스에 존재한다고 해도 제어할 수 없다.

    SQL> create public rollback segment rs1 tablespace system;
    create public rollback segment rs1 tablespace system
    *
    ERROR at line 1:
    ORA-30019: Illegal rollback Segment operation in Automatic Undo mode


3) UNDO 테이블스페이스의 undo segment와 SYSTEM rollback segment만
  ONLINE 상태 유지. 나머지 rollback segment와 OFFLINE 상태의
  UNDO 테이블스페이스에 존재하는 undo segment는 OFFLINE 상태.

  하지만, ONLINE 상태의 UNDO 테이블스페이스에 있는 모든 undo segment가
  ONLINE 상태를 유지하지는 않는다. 예를 들어, 10개의 undo segment가
  있다고 할지라도, SESSIONS 파라미터 값이 작다면, 적은 갯수의 undo
  segment가 online 상태로 구동이 되며, 트랜잭션 갯수가 늘어남에 따라
  필요한 undo segment가 자동으로 online 상태로 전환됨.
 

6. AUM과 Real Application Cluster

undo space 관리 기능은 Real Application Cluster 환경에도 유용하다.

1) Real Application Cluster 내의 모든 인스턴스는 동일한 undo mode에서
  운영되어야 한다.

2) global parameter에 UNDO_MANAGEMENT 값을 AUTO로 지정하거나
  모든 client-side parameter file에 UNDO_MANAGEMENT 값을 동일하게
  지정한다.

3) 각각의 인스턴스에 대해 별개의 UNDO_TABLESPACE를 각각 지정한다.
  각 인스턴스는 개별 UNDO 테이블스페이스를 필요로 한다.
  만약 UNDO_TABLESPACE 파라미터를 지정하지 않을 경우, 각 인스턴스는
  가용한 첫번째 UNDO 테이블스페이스를 사용한다.


7. 참고

1) UNDO_SUPPRESS_ERRORS 파라미터

  값을 TRUE로 지정할 경우, AUTO 모드에서 manual로 관리하는
  작업에 대해 에러메시지를 발생시키지 않으므로, 주의해서
  사용하여야 한다.
 
    SQL> alter rollback segment "_SYSSMU1$" online;
    Rollback segment altered.

    SQL> alter rollback segment "_SYSSMU13$" offline;
    Rollback segment altered.

    SQL> alter rollback segment rs1 online;
    Rollback segment altered.

  위 3개의 문장은 모두 성공한 것 처럼 보이지만, 실제로는 아무 작업도
  수행되지 않는다.

2) 수동으로 drop된 rollback segment의 경우와 마찬가지로, drop 된
  UNDO 테이블스페이스의 undo 정보를 참조하여야 하는 트랜잭션에서는
  다음과 같은 에러가 발생한다.
 
  ORA-01555 "snapshot too old (rollback segment too small)"
  -> snapshot이 DROP된 UNDO 테이블스페이스의 DROP-SCN보다 더 오래될 경
    우 발생


Reference Documents
-------------------
<note:135090.1
서버에 요청 중입니다. 잠시만 기다려 주십시오...