11. 롤백 세그먼트 다루기 (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 ]
[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 ]
[OPTIMAL ] )]
예) 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 ;
[/pre]
11. 템포러리 세그먼트 다루기 (Managing Temporary Segments)
[b]Temporary Segment Usage[/b]
; Temporary segment는 아래의 문장을 수행할 때 사용된다.
SELECT ... ORDER BY
CREATE INDEX
SELECT DISTINCT
SELECT ... GROUP BY
SELECT ... UNION
* size는 initial parameter SORT_AREA_SIZE 에서 설정한다.
[b]Temporary Segment 의 type (TEMPORARY, PERMANENT)[/b]
1) Temporary segments in a PERMANENT tablespace
- transaction이 필요할 때 생성된다.
- 문장이 완전하게 실행되었을 때 SMON이 작업한다.
ALTER TABLESPACE tablespace_name PERMANENT
2) Temporary segments in a TEMPORARY tablespace
- sort segment 라고도 한다.
- instance가 startup 한 후에 생성된다.
- instance가 shutdown 될 때까지 살아있다.
- Sort Extent Pool의 정보를 기초로 한다.
ALTER TABLESPACE tablespace_name TEMPORARY
[b]V$SORT_SEGMENT view : sort extent pool의 상태 정보[/b]
column :
tablespace_name
extent_size
total_extents
total_blocks
used_extents
used_blocks
free_extents
free_blocks
max_sort_size
max_sort_blocks
SVRMGR> SELECT tablespace_name, extent_size,
2 total_extents, max_sort_blocks
3 FROM v$sort_segment ;
[b]V$SORT_USAGE view : 현재 active sort 정보[/b]
column :
session_addr
tablespace
contents
extents
blocks
SVRMGR> SELECT s.username, u.tablespace,
2 u.contents, u.extents, u.blocks
3 FROM v$session s, v$sort_usage u
4 WHERE s.saddr = u.session_addr ;
[b] 연습[/b]
TEMP 테이블스페이스를 TEMPORARY 로 변경하고, 변경이 되었는지를 검증하십시오.
SQL> alter tablespace temp temporary ;
SQL> select tablespace_name, contents
2 from dba_tablespaces ;
SQL> select username, temporary_tablespace
2 from dba_users ;
==> system 의 temporary tablespace가 temp로 되어있는지 확인하고, 만약 아니면 바꾼다.
( alter user system temporary tablespace temp ;)
인스턴스를 종료하지 않고 SORT_AREA_SIZE 를 2Kb로 변경하십시오.
SQL> alter system set sort_area_size = 2048 deferred ;
* deferred : 이 명령을 실행하고 나서 다음에 접속할 때 부터 사용하라!
새롭게 사용자 SYSTEM 으로써 데이터베이스에 두 개의 session 을 오픈하십시오. 하나의 세션에서 srt_dd.sql 을 실행하고 나머지 세션에서 정렬 작업을 모니터 하십시오.
========== srt_dd.sql ===========
-- srt_dd.sql
-- Use for Lab 11 Q3 O8DBA class
SELECT object_name
FROM dba_objects
UNION
SELECT segment_name
FROM dba_segments
/
=================================
$ sqlplus system/manager
SQL> @ srt_dd
다른 터미날 윈도우를 열고,
$ sqlplus system/manager
SQL> select tablespace_name, total_extents, total_blocks
2 from v$sort_segment ;
SORT_AREA_SIZE 를 재설정 하십시오.
SQL> alter system set sort_area_size = 65536 deferred ;
|
|
|