본문 바로가기
OraclE

Managing Rollback Segments [펌]

by 타마마임팩트_쫀 2010. 2. 5.

[출처] http://www.ezdoum.com/upload/oracle/helphtml/Managing_rollback_segments.htm


Managing Rollback Segments

 - Rollback Segment : before image 저장

Rollback Segment의 목적

 - Transaction Rollback
 - Transaction Recovery
 - Read Consistency : 일괄성을 위해서...

Read-Consistency

 * Select 문장이 실행되는 도중에 데이터가 변경되더라도 변경전 data를 불러오게 일괄성을 준다.

 * SET TRANSACION READ ONLY 명령으로...
   Read only 모드이면서 일괄성있는 데이터를 보여주게된다.

  --> 이 모드 일 때, select 시간이 너무 길어서 그 시간중에 transaction이 너무 많이 일어나면
      ORA_01555 SNAPSHOT TOO OLD 에러가 발생할 수 있다.
      이 에러가 발생하면 rollback segment의 갯수를 늘려주면 된다.

Creating Rollback Segments

   CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment
      [TABLESPACE tablespace ]
      [STORAGE ([INITIAL integer [K|M]]
                [NEXT integer [K|M]]
                [MINEXTENTS integer]
                [MAXEXTENTS {integer|UNLIMITED}]
                [OPTIMAL {integer [K|M]|NULL}] )
      ]
   * PCTINCREASE 는 사용 못함.
   * MINEXTENTS >= 2

   예) CREATE ROLLBACK SEGMENT rbs01
       TABLESPACE rbs
       STORAGE (INITIAL 100K NEXT 100K OPTIMAL 4M
                MINEXTENTS 20 MAXEXTENTS 100) ;

Rollback Segments ONLINE 방법

 - Rollback Segment는 create하면 offline 상태이다.

   1) ALTER ROLLBACK SEGMENT rbs01 ONLINE ;
      --> shutdown 하면 다시 OFFLINE으로 된다.

   2) initSID.ora file에서 ROLLBACK_SEGMENTS=(rbs01)을 추가하면 된다.
      --> startup할 때마다 항상 적용된다.

Rollback Segment Storage 변경

   ALTER ROLLBACK SEGMENT rollback_segment
      [STORAGE ( [NEXT integer [K|M]]
                 [MINEXTENTS integer]
                 [MAXEXTENTS {integer|UNLIMITED}]
                 [OPTIMAL {integer[K|M]|NULL}] )]

   예) ALTER ROLLBACK SEGMENT rbs01
       STORAGE (MAXEXTENTS 200) ;

Rollback Segment Deallocate 하기

   예) ALTER ROLLBACK SEGMENT rbs01
       SHRINK TO 4M ;

Rollback Segment OFFLINE 방법

 - transaction이 끝날 때까지 대기하고 있다가 모든 transaction이 끝나면 OFFLINE이 된다.
 - 새로운 transaction을 허용하지 않는다.

   예) ALTER ROLLBACK SEGMENT rbs01 OFFLINE ;

Rollback Segment DROP 하기

 - DROP하기 전에는 반드시 OFFLINE을 해야 한다.

   예) DROP ROLLBACK SEGMENT rbs01 ;

DBA_ROLLBACK_SEGS view : Rollback Segment 정보를 갖고 있는 view 

  column :
      SEGMENT_ID
      SEGMENT_NAME
      TABLESPACE_NAME
      OWNER (PUBLIC or SYS)
      STATUS (ONLINE or OFFLINE)

  SVRMGR> SELECT segment_name, tablespace_name, owner, status
        2  FROM dba_rollback_segs ;

Rollback Segment Statistics

 V$ROLLNAME : usn, name
 V$ROLLSTAT : usn, extents, rssize, xacts, optsize, hwmsize, aveactive, status, curext, curblk

 - XACTS : 현재 rollback segment를 사용하고 있는 transaction 수

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

Rollback Segment: Current Activity

 V$SESSION : saddr, username, sid, serial#
 V$TRANSACTION : ses_addr, xidusn, ubafil, ubablk, ubasqn, ubarec, status, used_ublk, used_urec

   SVRMGR> SELECT s.username, t.xidusn, t.ubafil, t.ubablk, t.used_ublk
        2  FROM v$session s, v$transaction t
        3  WHERE s.saddr = t.ses_addr ;

Blocking Session 찾는 방법

   SVRMGR> SELECT s.sid, s.serial#, t.start_time, t.xidusn, s.username
        2  FROM v$session s, v$transaction t, v$rollstat r
        3  WHERE s.saddr = t.ses_addr
        4  AND t.xidusn = r.usn
        5  AND ((r.curext = t.start_uext-1) OR
        6      ((r.curext = r.extents-1) AND t.start_uext=0)) ;
   --> 첫 번째 extent가 blocking 되었을 땐 5LINE에서의 조건이 성립되지 않기 때문에...
       6LINE 조건을 추가한다.

[ 연습 ]

현재 database에 몇개의 rollback segment가 존재하는지 조회하십시오.

$ sqlplus system/manager
SQL> select * from dba_rollback_segs ;

rbs tablespace에 rbs03, rbs04 란 이름으로 rollback segment를 생성하십시오. (storage는 initial 10k next 10k minextents 2 optimal 20k 를 이용하십시오)

SQL> create rollback segment rbs03
  2  tablespace rbs
  3  storage (initial 10k next 10k minextents 2 optimal 20k) ;
SQL> create rollback segment rbs04
  2  tablespace rbs
  3  storage (initial 10k next 10k minextents 2 optimal 20k) ;

rollback segment들의 status를 조회하고, offline 상태인 rollback segment들을 online 상태로 만들어 보십시오.

SQL> select segment_name, tablespace_name, status
  2  from dba_rollback_segs ;
SQL> alter rollback segment rbs03 online ;
SQL> alter rollback segment rbs03 online ;

scott user 로 접속한 후 transaction 을 수행하고, 어느 rollback segment가 그 transaction 에 의해서 사용되고 있는지 확인하십시오.

$ sqlplus scott/tiger
SQL> create table test(name char(30)
  2  storage (initial 100k)
  3  tablespace data01 ;
SQL> insert into test values('aaaaaaaa') ;

다른 터미날 윈도우를 열어서,

$sqlplus system/manager
SQL> select name, extents
  2  from v$rollname n, v$rollstat s
  3  where n.usn = s.usn
  4  and s.xacts > 0 ;

scott user로 접속한 후, transaction을 수행하여 rollback segment가 shrink 되는지 확인하라.

$ sqlplus scott/tiger
SCOTT.SQL> set transaction use rollback segment rbs03 ;
SCOTT.SQL> begin
        2    for i in 1..500 loop
        3        insert into test values('aaaaaaaaaa') ;
        4    end loop ;
        5  end ;
        6  /

다른 터미날 윈도우를 열어서, rollback segment의 사용을 monitoring 한다.

$ sqlplus system/manager
SYSTEM.SQL> select name, extents
         2  from v$rollname n, v$rollstat s
         3  where n.usn = s.usn
         4  and s.xacts > 0 ;

SCOTT.SQL> rollback ;

SYSTEM.SQL> select name, extents, xacts, shrinks
         2  from v$rollname n, v$rollstat s
         3  where n.usn = s.usn ;
            ==> rbs03의 xacts와 extents 확인!!!
SYSTEM.SQL> alter rollback segment rbs03 shrink ;
SYSTEM.SQL> select name, extents, xacts, shrinks
         2  from v$rollname n, v$rollstat s
         3  where n.usn = s.usn ;
            ==> rbs03의 extents가 shrink 되었는지 확인!!!

rbs03 와 rbs04 rollback segment 에 active transaction 이 없는지 확인한 후, DROP 하십시오.

$ sqlplus system/manager
SQL> select name, extents, xacts, shrinks
  2  from v$rollname n, v$rollstat s
  3  where n.usn = s.usn ;
     ==> xacts 가 0 인지 확인!!!
SQL> alter rollback segment rbs03 offline ;
SQL> alter rollback segment rbs04 offline ;
SQL> drop rollback segment rbs03 ;
SQL> drop rollback segment rbs04 ;