강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
롤백세그먼트와 트랜잭션
조회 : 3,255  


롤백세그먼트와 트랜잭션

 

작성일: 2002-07-31 
작성자: 강명규
OS: Linux 2.4.18
Oralce: Oracle EE 8.1.7

[system]
SQL> connect system/xxxxxx@dbakorea
SQL> select segment_name,owner,tablespace_name,status from dba_rollback_segs;

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> create rollback segment rbs7
  2  tablespace rbs storage( optimal 5000k);

롤백 세그멘트가 생성되었습니다.

SQL> alter rollback segment rbs7 online;

롤백 세그멘트가 변경되었습니다.

SQL> select segment_name,owner,tablespace_name,status from dba_rollback_segs;

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
RBS7                           SYS    RBS                            ONLINE

9 개의 행이 선택되었습니다.

SQL> select n.name, s.status, xacts 
  2  from v$rollname n, v$rollstat s
  3  where n.usn = s.usn;

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
RBS7                           ONLINE                   0

9 개의 행이 선택되었습니다.






[kang]
테스트를 위해 kang유저로 또 하나의 SQL*PLUS창을 연다.
SQL> conn kang/xxxxxx@dbakorea
연결되었습니다.
SQL> set transaction use rollback segment rbs7;

트랜잭션이 설정되었습니다.

SQL> select * from test;

ID         PASSWD
---------- ----------
maddog     yyyy

SQL> update test set passwd='mmmm';

1 행이 갱신되었습니다.




[system]
여기까지 하면 rbs7 롤백세그먼트가 active 트랜잭션을 가지고 있다.

SQL> select n.name, s.status, xacts 
  2  from v$rollname n, v$rollstat s
  3  where n.usn = s.usn;

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
RBS7                           ONLINE                   1

9 개의 행이 선택되었습니다.


롤백세그먼트 rbs7에 1개의 트랜잭션이 활성화되어 있음을 알 수 있다.
물론, 이것은 kang이라는 사용자의 update문에 걸려있는 것이다. 
아직 kang은 commit이나 rollback을 한 상황이 아니다. rbs7을 offline으로 변경하자.

SQL> alter rollback segment rbs7 offline;

롤백 세그멘트가 변경되었습니다.

SQL> select segment_name,owner,tablespace_name,status from dba_rollback_segs;

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
RBS7                           SYS    RBS                            ONLINE

9 개의 행이 선택되었습니다.

트랜잭션을 가진 rbs7에 대한 offline이 막힘없이 된다. 어떻게 .. active transaction이 있는
롤백세그먼트가 offline이 성공하는가? 아.. 놀라워라. 그런데 dba_rollback_segs에 질의하니
online 상태라고 표시된다. 음.. 속았다. 그렇다. offline은 실제 pending중이다. 이것은
다음과 같이 v$rollstat에 질의해보면 알 수 있다.

SQL> select n.name, s.status, xacts 
  2  from v$rollname n, v$rollstat s
  3  where n.usn = s.usn;

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
RBS7                           PENDING OFFLINE          1

9 개의 행이 선택되었습니다.


이와 같이 peding offline상태에서는 더 이상의 추가적인 트랜잭션을 받아들이지 않는다.
즉, kang의 update문이 commit or rollback되기만을 기다리고 있다.
어느 시점에 kang이 트랜잭션을 종료하다면(commit or rollback), rbs7은 이 때 실질적인 offline상태로 변한다.







[kang]
SQL> commit;

커밋이 완료되었습니다.

SQL> select * from test;

ID         PASSWD
---------- ----------
maddog     mmmm


이제 트랜잭션을 종료했다. 어떻게 되나 보자.

[system]

SQL> select segment_name,owner,tablespace_name,status from dba_rollback_segs;

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
RBS7                           SYS    RBS                            OFFLINE

9 개의 행이 선택되었습니다.

SQL> select n.name, s.status, xacts 
  2  from v$rollname n, v$rollstat s
  3  where n.usn = s.usn;           

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> update test set passwd='nnnn';

1 행이 갱신되었습니다.


[system]

SQL> select n.name, s.status, xacts  
  2  from v$rollname n, v$rollstat s 
  3  where n.usn = s.usn;            

NAME                           STATUS               XACTS
------------------------------ --------------- ----------
SYSTEM                         ONLINE                   0
RBS0                           ONLINE                   1
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> Copyleft(C) 명규의 DBAKOREA All rights free

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=731


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
(주) 수퍼유저