[출처] 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 ;
'OraclE' 카테고리의 다른 글
V$FLASHBACK_DATABASE_LOG [펌] (0) | 2010.02.05 |
---|---|
Rollback Segment 삭제 [펌] (0) | 2010.02.05 |
Flashback [펌] (0) | 2010.02.05 |
동시접속 성능튜닝을 위한 테스트 TNS-12535: TNS:operation timed out [펌] (0) | 2010.01.29 |
오라클 시퀀스 [펌] (0) | 2010.01.27 |