반응형
/********************************************************************************************
-- Title : [8i] 롤백 세그먼트 관리(OLN)
-- Reference : OLN
-- Key word : rollback segment
********************************************************************************************/
/****************************************************************************************
-- 롤백 세그먼트 확인
****************************************************************************************/
SQL> SELECT tablespace_name, segment_name, bytes, blocks
2 FROM dba_segments
3 WHERE tablespace_name = 'RBS';
-- Title : [8i] 롤백 세그먼트 관리(OLN)
-- Reference : OLN
-- Key word : rollback segment
********************************************************************************************/
/****************************************************************************************
-- 롤백 세그먼트 확인
****************************************************************************************/
SQL> SELECT tablespace_name, segment_name, bytes, blocks
2 FROM dba_segments
3 WHERE tablespace_name = 'RBS';
TABLESPACE_NAME SEGMENT_NAME BYTES BLOCKS
------------------ ------------- ---------- ----------
RBS RBS0 4194304 512
RBS RBS1 4194304 512
RBS RBS2 4194304 512
RBS RBS3 4194304 512
RBS RBS4 4194304 512
RBS RBS5 4194304 512
RBS RBS6 4194304 512
------------------ ------------- ---------- ----------
RBS RBS0 4194304 512
RBS RBS1 4194304 512
RBS RBS2 4194304 512
RBS RBS3 4194304 512
RBS RBS4 4194304 512
RBS RBS5 4194304 512
RBS RBS6 4194304 512
7 rows selected.
/****************************************************************************************
-- 데이터베이스의 롤백 세그먼트
****************************************************************************************/
:: DBA_ROLLBACK_SEGS
ㅇ식별(Identification)
- segment_id
- segment_name
ㅇ위치, 유형, 상태
- tablespace_name
- owner(public or sys)
- status(online or offline)
SQL> SELECT segment_name, tablespace_name, owner, status
2 FROM dba_rollback_segs;
2 FROM dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME OWNER STATUS
------------- ---------------- ------ -------
SYSTEM SYSTEM SYS ONLINE
RBS0 RBS PUBLIC ONLINE
RBS1 RBS PUBLIC ONLINE
RBS2 RBS PUBLIC ONLINE
RBS3 RBS PUBLIC ONLINE
RBS4 RBS PUBLIC ONLINE
RBS5 RBS PUBLIC ONLINE
RBS6 RBS PUBLIC ONLINE
RBS01 RBS SYS OFFLINE
------------- ---------------- ------ -------
SYSTEM SYSTEM SYS ONLINE
RBS0 RBS PUBLIC ONLINE
RBS1 RBS PUBLIC ONLINE
RBS2 RBS PUBLIC ONLINE
RBS3 RBS PUBLIC ONLINE
RBS4 RBS PUBLIC ONLINE
RBS5 RBS PUBLIC ONLINE
RBS6 RBS PUBLIC ONLINE
RBS01 RBS SYS OFFLINE
9 rows selected.
/****************************************************************************************
-- 롤백 세그먼트 통계 추출위한 조인
****************************************************************************************/
- usn : 롤백 세그먼트 번호. 세그먼트의 이름을 알려면 v$rollname.usn과 조인 필요
- extents : 롤백 세그먼트의 익스텐트 개수
- rssize : 바이트 단위로 나타낸 세그먼트 현재 크기
- xacts : 세그먼트를 사용중인 트랜젝션 개수
- optsize : 롤백 세그먼트의 optimal 값
- hwmsize : high water mark, 세그먼트가 사용된 이후 최대로 많이 사용하였던 크기를 바이트 단위로 표시
- aveactive : 시간에 대해 평균한 현재 활성 익스텐트의 크기
- status : 롤백 세그먼트의 상태
(online은 롤백 세그먼트가 사용 가능함을 의미한다. pending offline은 롤백 세그먼트를
오프라인으로 만드는 명령이 수행되었으나 아직 세그먼트를 사용하는 활성 트랜젝션이
있음을 의미하며 롤백 세그먼트를 사용하는 트랜젝션이 전부 완료되자마자 offline상태
가 될 것임.)
- curext : 롤백 세그먼트 헤드의 현재 위치(익스텐트 번호)
- curblk : 롤백 세그먼트 헤드의 현재 위치(블록 번호)
SQL> SELECT n.name, s.extents, s.rssize, s.optsize, s.hwmsize, s.xacts, s.status
2 FROM v$rollname n, v$rollstat s
3 WHERE n.usn = s.usn;
NAME EXTENTS RSSIZE OPTSIZE HWMSIZE XACTS STATUS
------- ------- ------- ------- ------- ----- ------
SYSTEM 9 745472 745472 0 ONLINE
RBS0 8 4186112 4194304 4186112 0 ONLINE
RBS1 8 4186112 4194304 4186112 0 ONLINE
RBS2 8 4186112 4194304 4186112 0 ONLINE
RBS3 8 4186112 4194304 4186112 0 ONLINE
RBS4 8 4186112 4194304 4186112 0 ONLINE
RBS5 8 4186112 4194304 4186112 0 ONLINE
RBS6 8 4186112 4194304 4186112 0 ONLINE
/****************************************************************************************
-- 사용중인 롤백 세그먼트 점검위한 조인
****************************************************************************************/
- ses_addr : 세션 주소, v$session.saddr과 조인될 수 있음
- xidusn : 트랜젝션이 사용하는 롤백 세그먼트 번호
- ubafil : 트랜젝션 ID의 일부로 사용됨, 트랜젝션이 기록중인 롤백 세그먼트의 현 위치 지정
- ubasqn : 트랜젝션 ID의 일부로 사용됨, 트랜젝션이 기록중인 롤백 세그먼트의 현 위치 지정
- ubarec : 트랜젝션 ID의 일부로 사용됨, 트랜젝션이 기록중인 롤백 세그먼트의 현 위치 지정
- used_ublk : 트랜젝션이 만들어 내는 실행 취소 블록의 개수
- start_uext : 트랜젝션이 쓰기 시작할 롤백 세그먼트 익스텐트
- start_ubafil : 트랜젝션이 쓰기 시작할 롤백 세그먼트 파일 번호
- start_ubablk : 트랜젝션이 쓰기 시작할 롤백 세그먼트 블록 번호
SQL> 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;
USERNAME XIDUSN UBAFIL UBABLK USED_UBLK
------------ ---------- ---------- ----------- -----------
SYSTEM 2 2 7 1
SCOTT 1 2 163 1
2 rows selected.
/****************************************************************************************
-- 관리용
****************************************************************************************/
-- rollback_seg.sql
select a.tablespace_name, a.segment_name, b.segment_type
, a.min_extents, a.pct_increase, a.status, b.bytes, b.blocks
from dba_rollback_segs a, dba_segments b
where a.segment_name = b.segment_name
/
-- rollback_seg_stats.sql
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
/
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
/
-- rollback_seg_blocking.sql
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));
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));
-- rollback_seg_cont.sql
select n.name, round(100 * s.waits/s.gets)
from v$rollname n, v$rollstat s
where n.usn = s.usn
/
select n.name, round(100 * s.waits/s.gets)
from v$rollname n, v$rollstat s
where n.usn = s.usn
/
/****************************************************************************************
-- 트랜젝션 일관선 요구
****************************************************************************************/
SQL> SET TRANSACTION READ ONLY;
-- 트랜젝션 일관선 요구
****************************************************************************************/
SQL> SET TRANSACTION READ ONLY;
SQL> SET TRANSACTION SERIALIZABLE;
/****************************************************************************************
-- 롤백 세그먼트 생성 및 확인
****************************************************************************************/
SQL> CREATE ROLLBACK SEGMENT rbs01
2 TABLESPACE rbs
3 STORAGE( INITIAL 100K
4 NEXT 100K
5 OPTIMAL 4M
6 MINEXTENTS 20
7 MAXEXTENTS 100);
Rollback segment created.
SQL> SELECT tablespace_name, segment_name, bytes, blocks
2 FROM dba_segments
3 WHERE tablespace_name = 'RBS';
2 FROM dba_segments
3 WHERE tablespace_name = 'RBS';
TABLESPACE_NAME SEGMENT_NAME BYTES BLOCKS
------------------ ------------- ---------- ----------
RBS RBS0 4194304 512
RBS RBS1 4194304 512
RBS RBS2 4194304 512
RBS RBS3 4194304 512
RBS RBS4 4194304 512
RBS RBS5 4194304 512
RBS RBS6 4194304 512
RBS RBS01 10485760 1280
------------------ ------------- ---------- ----------
RBS RBS0 4194304 512
RBS RBS1 4194304 512
RBS RBS2 4194304 512
RBS RBS3 4194304 512
RBS RBS4 4194304 512
RBS RBS5 4194304 512
RBS RBS6 4194304 512
RBS RBS01 10485760 1280
8 rows selected.
/****************************************************************************************
-- 온라인 롤백 세그먼트로 만들기
****************************************************************************************/
SQL> ALTER ROLLBACK SEGMENT rbs01 ONLINE;
Rollback segment altered.
/* 인스턴스가 롤백 세그먼트를 항상 온라인 상태가 되도록 파라미터 설정 */
$ more $ORACLE_HOME/dbs/initORCL.ora
...
rollback_segments = ( RBS0, RBS1, RBS2, RBS3, RBS4, RBS5, RBS6, rbs01)
...
$ more $ORACLE_HOME/dbs/initORCL.ora
...
rollback_segments = ( RBS0, RBS1, RBS2, RBS3, RBS4, RBS5, RBS6, rbs01)
...
SQL> show parameter roll
NAME TYPE VALUE
------------------------------------ ------- ------------------------------
fast_start_parallel_rollback string LOW
gc_rollback_locks string 0-128=32!8REACH
max_rollback_segments integer 30
rollback_segments string rbs0, rbs1, rbs2, rbs3, rbs4,
rbs5, rbs6, rbs7
transactions_per_rollback_segment integer 5
------------------------------------ ------- ------------------------------
fast_start_parallel_rollback string LOW
gc_rollback_locks string 0-128=32!8REACH
max_rollback_segments integer 30
rollback_segments string rbs0, rbs1, rbs2, rbs3, rbs4,
rbs5, rbs6, rbs7
transactions_per_rollback_segment integer 5
/****************************************************************************************
-- 롤백 세그먼트 스토리지 설정 변경
****************************************************************************************/
SQL> ALTER ROLLBACK SEGMENT rbs01
2 STORAGE (MAXEXTENTS 200);
Rollback segment altered.
/****************************************************************************************
-- 롤백 세그먼트의 공간 할당 해제
****************************************************************************************/
SQL> ALTER ROLLBACK SEGMENT rbs01
2 SHRINK TO 4M;
Rollback segment altered.
/****************************************************************************************
-- 오프라인 롤백 세그먼트 및 확인
****************************************************************************************/
SQL> ALTER ROLLBACK SEGMENT rbs01 OFFLINE;
Rollback segment altered.
SQL> SELECT segment_name, owner, tablespace_name, status
2 FROM dba_rollback_segs
3 WHERE segment_name = 'RBS01'
SEGMENT_NAME OWNER TABLESPACE_NAME STATUS
------------- ------ ---------------- -------
RBS01 SYS RBS OFFLINE
2 FROM dba_rollback_segs
3 WHERE segment_name = 'RBS01'
SEGMENT_NAME OWNER TABLESPACE_NAME STATUS
------------- ------ ---------------- -------
RBS01 SYS RBS OFFLINE
1 rows selected.
/****************************************************************************************
-- 롤백 세그먼트에서의 Blocking 세션 검출
****************************************************************************************/
SQL> 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
((r.curext = r.extents-1) AND t.start_uext=0));
SID SERIAL$ START_TIME XIDUSN USERNAME
--- ------- ----------------- ------ --------
9 27 10/30/97 21:10 41 2 SYSTEM
1 row selected.
반응형