Oacle 스크롤 백 메커니즘 에 대한 심도 있 는 탐구

12052 단어 Oacle
undo 메커니즘 은 oracle 의 교묘 한 점 이자 oracle 을 배 우 는 난점 중의 하나 이다.
아래 에서 우 리 는 내부 에서 그것 을 구체 적 으로 이해한다.
세 션 1: scott 사용자, 트 랜 잭 션 시작
hr@ORCL> conn scott/oracle
Connected.
scott@ORCL> UPDATE emp SET sal=4000 WHERE empno=7788;

1 row updated.

scott@ORCL> SELECT empno,ename,job,mgr,sal FROM emp WHERE empno=7788;

     EMPNO ENAME      JOB              MGR        SAL
---------- ---------- --------- ---------- ----------
      7788 SCOTT      ANALYST         7566       4000

이 트 랜 잭 션 을 제출 하지 않 습 니 다. 세 션 2: SYS 사용자 가 트 랜 잭 션 정 보 를 가 져 옵 니 다.
v $transaction 에서 얻 을 수 있 습 니 다: 이 사 무 는 9 번 스크롤 백 단계 에 있 고 26 번 트 랜 잭 션 슬롯 에 있 습 니 다.
sys@ORCL> SELECT xidusn,xidslot FROM v$transaction;

    XIDUSN    XIDSLOT
---------- ----------
         9         26

v $rollstat 에서 도 이 트 랜 잭 션 이 9 번 스크롤 백 단계 임 을 알 수 있 습 니 다.
sys@ORCL> SELECT usn,xacts FROM v$rollstat;

       USN      XACTS
---------- ----------
         0          0
         1          0
         2          0
         3          0
         4          0
         5          0
         6          0
         7          0
         8          0
         9          1
        10          0

dump 스크롤 백 세그먼트 헤더 정보
sys@ORCL> SELECT * FROM v$rollname a WHERE a.usn=9;

       USN NAME
---------- ------------------------------
         9 _SYSSMU9$

sys@ORCL> alter system dump undo header '_SYSSMU9$';

System altered.

sys@ORCL> select spid from v$process where addr in (select paddr from v$session where sid in (select sid 
  2  from v$mystat where rownum=1));

SPID
------------
10086

부분 내용 은 다음 과 같 습 니 다.
********************************************************************************
Undo Segment:  _SYSSMU9$ (9)
********************************************************************************
  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 4      #blocks: 31
                  last map  0x00000000  #maps: 0      offset: 4080
      Highwater::  0x00800615  ext#: 2      blk#: 4      ext size: 8
  #blocks in seg. hdr's freelists: 0
  #blocks below: 0
  mapblk  0x00000000  offset: 2
                   Unlocked
     Map Header:: next  0x00000000  #extents: 4    obj#: 0      flag: 0x40000000
  Extent Map
  -----------------------------------------------------------------
   0x0080008a  length: 7
   0x008000d9  length: 8
   0x00800611  length: 8
   0x00800669  length: 8

 Retention Table
  -----------------------------------------------------------
 Extent Number:0  Commit Time: 1344269736
 Extent Number:1  Commit Time: 1344276385
 Extent Number:2  Commit Time: 1344264118
 Extent Number:3  Commit Time: 1344264252

  TRN CTL:: seq: 0x0105 chd: 0x0019 ctl: 0x0014 inc: 0x00000000 nfb: 0x0000
            mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
            uba: 0x00800615.0105.11 scn: 0x0000.000d2615
Version: 0x01
  FREE BLOCK POOL::
    uba: 0x00000000.0105.10 ext: 0x2  spc: 0x16f6
    uba: 0x00000000.0105.03 ext: 0x2  spc: 0x1eac
    uba: 0x00000000.0101.0b ext: 0xb  spc: 0x198c
    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0
    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0
  TRN TBL::

  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt
  ------------------------------------------------------------------------------------------------
   0x00    9    0x00  0x0162  0x0029  0x0000.000d2ab9  0x00800613  0x0000.000.00000000  0x00000001   0x00000000  1344280244
             ............................................
   0x1a   10    0x80  0x0162  0x0002  0x0000.00000000  0x00800615  0x0000.000.00000000  0x00000001   0x00000000  0
             ............................................

이것 이 바로 사무 표 정 보 를 포함 한 신비 한 스크롤 백 헤드 의 정보 이다.그 중에서 0x1a 는 16 진수 이 고 10 진법 으로 전환 합 니 다.
scott@ORCL> select to_number('1a','xx') from dual;

TO_NUMBER('1A','XX')
--------------------
                  26

이 를 통 해 알 수 있 듯 이 0x1a 는 26 이다. 앞의 사무 정 보 를 돌 이 켜 보면 이 사 무 는 26 번 사무 슬롯 을 차지 하고 상태 (state) 는 10 으로 활동 사 무 를 대표 한다.
dump 옛 값 정보 세그먼트 헤더 정보의 일곱 번 째 열: dba (data block address) 는 스크롤 백 블록 의 주소 0x 00800615 를 말 합 니 다. dba 를 번역 하 겠 습 니 다.
sys@ORCL> select to_number('00800615','xxxxxxxx') from dual;

TO_NUMBER('00800615','XXXXXXXX')
--------------------------------
                         8390165

sys@ORCL> select dbms_utility.data_block_address_file(8390165) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(8390165)
---------------------------------------------
                                            2

sys@ORCL> select dbms_utility.data_block_address_block(8390165) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(8390165)
----------------------------------------------
                                          1557

이 를 통 해 알 수 있 듯 이 오래된 값 은 2 번 파일 의 1557 번 째 스크롤 백 블록 에 있 습 니 다. 이것 은 v $transaction 에서 조회 한 데이터 와 완전히 일치 합 니 다.
sys@ORCL> select ubafil,ubablk from v$transaction;

    UBAFIL     UBABLK
---------- ----------
         2       1557

세 션 1 로 돌아 가 DML 사 무 를 계속 합 니 다: scott 사용자
scott@ORCL> update emp set sal=4000 where empno=7788;

1 row updated.

scott@ORCL> update emp set sal=4000 where empno=7782;

1 row updated.

scott@ORCL> update emp set sal=40000 where empno=7698;

1 row updated.

세 션 2: sys 사용자 가 스크롤 백 1557 dump 를 꺼 냅 니 다.
sys@ORCL> select spid from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat  where rownum=1));

SPID
------------
11146

sys@ORCL> alter system dump datafile 2 block 1557;

System altered.

스크롤 백 1557 에서 시작 하 는 정보 부분 은 다음 과 같 습 니 다.
*** 2012-08-07 16:31:42.449
*** SERVICE NAME:(SYS$USERS) 2012-08-07 16:31:42.355
*** SESSION ID:(135.102) 2012-08-07 16:31:42.355
Start dump data blocks tsn: 1 file#: 2 minblk 1557 maxblk 1557
buffer tsn: 1 rdba: 0x00800615 (2/1557)
scn: 0x0000.000d36d2 seq: 0x01 flg: 0x04 tail: 0x36d20201
frmt: 0x02 chkval: 0xbeca type: 0x02=KTU UNDO BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0E7E4400 to 0x0E7E6400
......................
********************************************************************************
UNDO BLK:
xid: 0x0009.01a.00000162  seq: 0x105 cnt: 0x14  irb: 0x14  icl: 0x0   flg: 0x0000

 Rec Offset      Rec Offset      Rec Offset      Rec Offset      Rec Offset
---------------------------------------------------------------------------
0x01 0x1f08     0x02 0x1e58     0x03 0x1df4     0x04 0x1da0     0x05 0x1d1c
0x06 0x1ca0     0x07 0x1c54     0x08 0x1b80     0x09 0x1afc     0x0a 0x1a70
0x0b 0x198c     0x0c 0x1924     0x0d 0x18cc     0x0e 0x17e8     0x0f 0x1780
0x10 0x1728     0x11 0x16a8     0x12 0x1650     0x13 0x15f4     0x14 0x1598

*-----------------------------

이 부분 정 보 는 인자 irb: 0x 14 가 있 습 니 다.irb 는 스크롤 백 에 기 록 된 최근 제출 되 지 않 은 모든 업무 의 시작 점, 즉 최근 에 수 정 된 곳 을 말 합 니 다. 스크롤 백 을 하려 면 스크롤 백 의 시작 점 입 니 다.위 에서 알 수 있 듯 이 (irb: 0x 14) 의 오프셋 주 소 는 0x 1598 로 irb: 0x 14 정 보 를 찾 았 습 니 다. 다음 과 같 습 니 다.
*-----------------------------
* Rec #0x14  slt: 0x1a  objn: 51148(0x0000c7cc)  objd: 51148  tblspc: 4(0x00000004)
*       Layer:  11 (Row)   opc: 1   rci 0x13
Undo type:  Regular undo   Last buffer split:  No
Temp Object:  No
Tablespace Undo:  No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02  ver: 0x01
op: C  uba: 0x00800615.0105.13
KDO Op code: URP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x01000020  hdba: 0x0100001b
itli: 2  ispac: 0  maxfr: 4858
tabn: 0 slot: 5(0x5) flag: 0x2c lock: 0 ckix: 191
ncol: 8 nnew: 1 size: 1
col  5: [ 3]  c2 1d 33

c2 1d 33 을 10 진법 으로 바 꾸 면 2850 입 니 다. 이것 은 마지막 으로 업 데 이 트 된 기록 의 오래된 값 입 니 다.바로 update emp set sal = 4000 where empno = 7698 이다.
주의해 야 할 몇 가지 인자 가 있 습 니 다.
1) 매개 변수 rci 0x 13, 이 매개 변 수 는 undo chain (같은 업무 에서 여러 번 수정 되 었 습 니 다. chain 링크 에 따라) 을 대표 합 니 다. 이 곳 의 rci 0x 13 은 두 번 째 수정 update emp set sal = 4000 where empno = 7782 를 가리 키 고 있 습 니 다. 이 때 다른 프로 세 스 가 scott. emp 표를 조회 하면 Oacle 은 일치 하 게 읽 어서 데 이 터 를 사용자 에 게 보 여 줘 야 합 니 다.2) 매개 변수 bdba: 0x 01000020, 이 매개 변 수 는 이전 값 에 대응 하 는 데이터 블록 의 주 소 를 대표 합 니 다. 다음은 이 매개 변 수 를 번역 합 니 다.
scott@ORCL> select to_number('01000020','xxxxxxxx') from dual;

TO_NUMBER('01000020','XXXXXXXX')
--------------------------------
                        16777248

scott@ORCL> select dbms_utility.data_block_address_file(16777248) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(16777248)
----------------------------------------------
                                             4

scott@ORCL> select dbms_utility.data_block_address_block(16777248) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(16777248)
-----------------------------------------------
                                             32

4 번 파일 의 32 번 째 덤 프 를 나 옵 니 다:
sys@ORCL> select spid from v$process where addr in (select paddr from v$session
  2  where sid in (select sid from v$mystat where rownum=1));

SPID
------------
13929

sys@ORCL> alter system dump datafile 4 block 32;

System altered.

부분 내용 은 다음 과 같 습 니 다.
Start dump data blocks tsn: 4 file#: 4 minblk 32 maxblk 32
buffer tsn: 4 rdba: 0x01000020 (4/32)
scn: 0x0000.000d36d2 seq: 0x01 flg: 0x04 tail: 0x36d20601
frmt: 0x02 chkval: 0xa9ea type: 0x06=trans data
Block header dump:  0x01000020
 Object id on Block? Y
 seg/obj: 0xc7cc  csc: 0x00.b9cf3  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1000019 ver: 0x01 opc: 0
     inc: 0  exflg: 0

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0003.011.000000f2  0x00805794.00c8.49  C---    0  scn 0x0000.0006bfdb
0x02   0x0009.01a.00000162  0x00800615.0105.14  ----    3  fsc 0x0002.00000000

ITL 트 랜 잭 션 슬롯 정보 가 존재 합 니 다. 트 랜 잭 션 은 ITL 트 랜 잭 션 슬롯 을 받 아야 데이터 수정 이 가능 합 니 다.ITL 내용 은 xid (스크롤 백 헤드 를 가리 키 는 ITL), uba (스크롤 백 블록 을 가리 키 는), Lck (줄 잠 금 의 개수, 여기 서 세 번 수정 하기 때문에 3 개의 잠 금 이 있 음) 을 포함 합 니 다. 상기 출력 에서 알 수 있 듯 이 itl 2 (0x 02) 에 이벤트 가 있 습 니 다.
xid (0x0009.01a. 0000162) 를 분해 합 니 다. 0009 는 이 사무 가 9 번 스크롤 백 을 가리 키 고 01a 는 이 사무 가 26 번 트 랜 잭 션 슬롯 을 가리 키 고 00000162 는 이 업무 가 354 번 째 로 덮어 졌 음 을 나타 냅 니 다 (스크롤 백 은 순환 적 으로 사용 되 기 때 문 입 니 다). uba (0x00800615.0105.14) 를 분해 합 니 다. 00800615 는 1557 번 째 스크롤 백 블록 을 나타 내 고 14 는 irb 정보 (스크롤 백 의 출발점) 입 니 다.
이로써 undo 세그먼트 와 데이터 블록 안의 사무 정 보 는 완전히 해석 되 었 고 이들 은 완전히 일치 합 니 다!

좋은 웹페이지 즐겨찾기