데이터베이스 분류
롤백세그먼트와 트랜잭션
작성자 정보
- 웹관리자 작성
- 작성일
컨텐츠 정보
- 7,218 조회
- 0 추천
- 목록
본문
롤백세그먼트와 트랜잭션
작성일: 2002-07-31 작성자: 강명규 OS: Linux 2.4.18 Oralce: Oracle EE 8.1.7 [system] SQL> SQL> SEGMENT_NAME OWNER TABLESPACE_NAME STATUS ------------------------------ ------ ------------------------------ ---------------- SYSTEM SYS SYSTEM ONLINE RBS0 PUBLIC RBS ONLINE RBS1 PUBLIC RBS ONLINE RBS2 PUBLIC RBS ONLINE RBS3 PUBLIC RBS ONLINE RBS4 PUBLIC RBS ONLINE RBS5 PUBLIC RBS ONLINE RBS6 PUBLIC RBS ONLINE 8 개의 행이 선택되었습니다. SQL> 2 롤백 세그멘트가 생성되었습니다. SQL> 롤백 세그멘트가 변경되었습니다. SQL> SEGMENT_NAME OWNER TABLESPACE_NAME STATUS ------------------------------ ------ ------------------------------ ---------------- SYSTEM SYS SYSTEM ONLINE RBS0 PUBLIC RBS ONLINE RBS1 PUBLIC RBS ONLINE RBS2 PUBLIC RBS ONLINE RBS3 PUBLIC RBS ONLINE RBS4 PUBLIC RBS ONLINE RBS5 PUBLIC RBS ONLINE RBS6 PUBLIC RBS ONLINE 9 개의 행이 선택되었습니다. SQL> 2 3 NAME STATUS XACTS ------------------------------ --------------- ---------- SYSTEM ONLINE 0 RBS0 ONLINE 0 RBS1 ONLINE 0 RBS2 ONLINE 0 RBS3 ONLINE 0 RBS4 ONLINE 0 RBS5 ONLINE 0 RBS6 ONLINE 0 9 개의 행이 선택되었습니다. [kang] 테스트를 위해 kang유저로 또 하나의 SQL*PLUS창을 연다. SQL> 연결되었습니다. SQL> 트랜잭션이 설정되었습니다. SQL> ID PASSWD ---------- ---------- maddog yyyy SQL> 1 행이 갱신되었습니다. [system] 여기까지 하면 rbs7 롤백세그먼트가 active 트랜잭션을 가지고 있다. SQL> 2 3 NAME STATUS XACTS ------------------------------ --------------- ---------- SYSTEM ONLINE 0 RBS0 ONLINE 0 RBS1 ONLINE 0 RBS2 ONLINE 0 RBS3 ONLINE 0 RBS4 ONLINE 0 RBS5 ONLINE 0 RBS6 ONLINE 0 9 개의 행이 선택되었습니다. 롤백세그먼트 rbs7에 1개의 트랜잭션이 활성화되어 있음을 알 수 있다. 물론, 이것은 kang이라는 사용자의 update문에 걸려있는 것이다. 아직 kang은 commit이나 rollback을 한 상황이 아니다. rbs7을 offline으로 변경하자. SQL> 롤백 세그멘트가 변경되었습니다. SQL> SEGMENT_NAME OWNER TABLESPACE_NAME STATUS ------------------------------ ------ ------------------------------ ---------------- SYSTEM SYS SYSTEM ONLINE RBS0 PUBLIC RBS ONLINE RBS1 PUBLIC RBS ONLINE RBS2 PUBLIC RBS ONLINE RBS3 PUBLIC RBS ONLINE RBS4 PUBLIC RBS ONLINE RBS5 PUBLIC RBS ONLINE RBS6 PUBLIC RBS ONLINE 9 개의 행이 선택되었습니다. 트랜잭션을 가진 rbs7에 대한 offline이 막힘없이 된다. 어떻게 .. active transaction이 있는 롤백세그먼트가 offline이 성공하는가? 아.. 놀라워라. 그런데 dba_rollback_segs에 질의하니 online 상태라고 표시된다. 음.. 속았다. 그렇다. offline은 실제 pending중이다. 이것은 다음과 같이 v$rollstat에 질의해보면 알 수 있다. SQL> 2 3 NAME STATUS XACTS ------------------------------ --------------- ---------- SYSTEM ONLINE 0 RBS0 ONLINE 0 RBS1 ONLINE 0 RBS2 ONLINE 0 RBS3 ONLINE 0 RBS4 ONLINE 0 RBS5 ONLINE 0 RBS6 ONLINE 0 9 개의 행이 선택되었습니다. 이와 같이 peding offline상태에서는 더 이상의 추가적인 트랜잭션을 받아들이지 않는다. 즉, kang의 update문이 commit or rollback되기만을 기다리고 있다. 어느 시점에 kang이 트랜잭션을 종료하다면(commit or rollback), rbs7은 이 때 실질적인 offline상태로 변한다. [kang] SQL> 커밋이 완료되었습니다. SQL> ID PASSWD ---------- ---------- maddog mmmm 이제 트랜잭션을 종료했다. 어떻게 되나 보자. [system] SQL> SEGMENT_NAME OWNER TABLESPACE_NAME STATUS ------------------------------ ------ ------------------------------ ---------------- SYSTEM SYS SYSTEM ONLINE RBS0 PUBLIC RBS ONLINE RBS1 PUBLIC RBS ONLINE RBS2 PUBLIC RBS ONLINE RBS3 PUBLIC RBS ONLINE RBS4 PUBLIC RBS ONLINE RBS5 PUBLIC RBS ONLINE RBS6 PUBLIC RBS ONLINE 9 개의 행이 선택되었습니다. SQL> 2 3 NAME STATUS XACTS ------------------------------ --------------- ---------- SYSTEM ONLINE 0 RBS0 ONLINE 0 RBS1 ONLINE 0 RBS2 ONLINE 0 RBS3 ONLINE 0 RBS4 ONLINE 0 RBS5 ONLINE 0 RBS6 ONLINE 0 8 개의 행이 선택되었습니다. dba_rollback_segs에는 offline으로 변경되었고, v$rollstat에는 rbs7항목이 사라졌음을 알 수 있다. 실제, 위의 내용은 시간이 좀 지나서 변경된다. 빠른 결과를 보고 싶다면, alter rollback segment rbs7 offline을 한 번 더 수행주면 되겠다. kang이 rbs7을 사용하라고 지정해두었는데 이제 rbs7가 offline이 되었으니 더이상 kang의 트랜잭션은 rbs7을 사용하지 못한다. 그럼 트랜잭션을 사용하면 어떻게 될까? 아래에서 보듯이 임의로 지정된(?) rbs0가 트랜잭션에 사용됨을 알 수 있다. [kang] SQL> 1 행이 갱신되었습니다. [system] SQL> 2 3 NAME STATUS XACTS ------------------------------ --------------- ---------- SYSTEM ONLINE 0 RBS1 ONLINE 0 RBS2 ONLINE 0 RBS3 ONLINE 0 RBS4 ONLINE 0 RBS5 ONLINE 0 RBS6 ONLINE 0 8 개의 행이 선택되었습니다. 자신이 사용하고 있는 ROLLBACK SEGMENT파악 SQL> SELECT r.name "RBS", s.sid, s.serial#, s.username "USER", t.status, 2 t.cr_get, t.phy_io, t.used_ublk, t.noundo, 3 substr(s.program, 1, 78) "COMMAND" 4 FROM sys.v_$session s, sys.v_$transaction t, sys.v_$rollname r 5 WHERE t.addr = s.taddr 6 and t.xidusn = r.usn 7 ORDER BY t.cr_get, t.phy_io; RBS SID SERIAL# USER STATUS CR_GET PHY_IO USED_UBLK NOU COMMAND ----- ----- ---------- ---------- ------ ---------- ---------- ---------- --- ---------------------- RBS0 9 59 KANG ACTIVE 1 0 1 NO SQLPLUSW.EXE SQL> select c.segment_name, e.sid, e.username, 2 b.object_name, b.object_type, 3 d.used_urec, a.os_user_name, 4 d.xidusn, d.start_time, 5 e.process, e.program, e.status 6 from v$locked_object a, 7 dba_objects b, 8 dba_rollback_segs c, 9 v$transaction d, 10 v$session e 11 where a.object_id = b.object_id 12 and a.xidusn = c.segment_id 13 and a.xidusn = d.xidusn 14 and a.xidslot = d.xidslot 15 and d.addr = e.taddr; SEGMENT_NAME SID USERNAME OBJECT_NAME OBJEC USED_UREC OS_USER_NAME XIDUSN START_TIME PROCE ------------ ----- -------- ----------- ----- ---------- --------------- ---------- ---------------- RBS0 9 KANG TEST TABLE 1 Administrator 1 08/04/02 21:58:03
1132:356 SQLPLUSW.EXE SQL>
"무단배포금지: 클라우드포털(www.linux.co.kr)의 모든 강좌는 저작권에 의해 보호되는 콘텐츠입니다. 무단으로 복제하여 배포하는 행위는 금지되어 있습니다."
관련자료
-
이전
-
다음
댓글 0
등록된 댓글이 없습니다.