ロールバック・セグメントに関する検証 その6

~ロールバック・セグメントに関する検証 その6~
ペンネーム ちゃむ

前回は、トランザクション表(TRN TBL)の実態をブロックダンプより確認した。

今回は、トランザクション表、ロールバック・セグメントのデータブロック
(undoブロック)、表などのデータブロック中に存在するITL
(INTERESTED TRANSACTION LIST)の関係に迫ってみる。

トランザクション表とUNDO BLOCKは、今まで見てきたのでわかると思うが、
ITLとはなんであろうか?
例えば、表のデータなどを更新した後、他のセッション等から、そのデータブ
ロックを取得するSELECT文を発行したときに、コミット前であれば読み取り一
貫性を実現するために、更新前の情報、つまりロールバック・セグメントに格
納してあるUNDOブロック情報を取得する必要がある。だから、このITLには、
トランザクション表とUNDOブロックの場所を識別するための情報が格納される。

また、実際に「ROLLBACK ;」のコマンドが発行されたときも、このITLの情報を
もとにUNDOブロックの場所を特定して、更新前の値に戻すことができる。

このあたりの内容は、ロックとも非常に関連が深いが、ロックに関する詳しい
内容は、別の機会で検証しようと思う。

関係図を以下に示す。

———————–テーブルのデータブロックダンプの抜粋(ダンプ1)———————– Start dump data blocks tsn: 3 file#: 4 minblk 61826 maxblk 61826 buffer tsn: 3 rdba: 0x0100f182 (4/61826) scn: 0x0000.00ed6bc1 seq: 0x0c flg: 0x00 tail: 0x6bc1060c frmt: 0x02 chkval: 0x0000 type: 0x06=trans data Block header dump: 0x0100f182 Object id on Block? Y seg/obj: 0x1548 csc: 0x00.ed6b7a itc: 1 flg: O typ: 1 – DATA fsl: 0 fnx: 0x0 ver: 0x01 Itl Xid Uba Flag Lck Scn/Fsc 0x01 xid: 0x0009.000.0000005b uba: 0x00800298.010d.0c —- 12 fsc 0x000c.00000000 ———————————————————————————————

上記ダンプ1のXid=0x0009.000.0000005b (16進数で表現されている)は、
左から順に、「ロールバック・セグメントの番号」、「スロット番号」、「順序番号」
であるが、下記ダンプ2のstate=10のindex=「スロット番号」、wrap#=「順序番号」
に一致する。
「ロールバック・セグメントの番号」は、
set transaction use rollback segment rb_find50 ;で指定したロールバック・
セグメントなので、以下のSQL文の結果のSEGMENT_IDの値と一致する。

SQL> select segment_id from DBA_ROLLBACK_SEGS where segment_name = 'RB_FIND50' ;

SEGMENT_ID
----------
         9 ← Xid=0x0009と一致する

上記ダンプ1のUba=0x00800298は、
下記ダンプ2のTRN TBLのdba=0x00800298に一致する。

上記ダンプ1のscn: 0x0000.00ed6bc1は、
下記ダンプ2のTRN TBLのscn=0x0000.00ed6bc1に一致する。

これらより、テーブルのデータブロックのITLからロールバック・セグメントの
場所を特定できる様子がわかるであろう。つまり、これらが「読み取り一貫性」
と「ROLLBACK」を実現するための元データとなる。

-------------------トランザクション表「TRN TBL」ブロックダンプの抜粋(ダンプ2)------------------
Start dump data blocks tsn: 1 file#: 2 minblk 662 maxblk 662
buffer tsn: 1 rdba: 0x00800296 (2/662)
scn: 0x0000.00ed6bc1 seq: 0x01 flg: 0x00 tail: 0x6bc10e01
frmt: 0x02 chkval: 0x0000 type: 0x0e=KTU UNDO HEADER W/UNLIMITED EXTENTS
....................................................................................... 

 TRN TBL::

  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub
  ------------------------------------------------------------------------------------------------
   0x00   10    0xc0  0x005b  0x0000  0x0000.00ed6bc1  0x00800298  0x0000.000.00000000  0x00000001
   0x01    9    0x00  0x005a  0x0002  0x0000.00ed6b83  0x00000000  0x0000.000.00000000  0x00000000
..................................................................................................
   0x13    9    0x00  0x005a  0x0014  0x0000.00ed6b83  0x00000000  0x0000.000.00000000  0x00000000
   0x14    9    0x00  0x005a  0xffff  0x0000.00ed6b83  0x00000000  0x0000.000.00000000  0x00000000
--------------------------------------------------------------------------------------------------

上記ダンプ1、2のxid: 0x0009.000.0000005bは、
下記ダンプ3のxid: 0x0009.000.0000005bに一致する。

上記ダンプ1、2のscnは、
下記ダンプ3のscn: 0x0000.00ed6bc1と一致する。

ダンプ3のcol 1: [ 5] 53 4d 49 54 48は、まさに更新前のカラムの値である。

------------------UNDOブロックのブロックダンプの抜粋(ダンプ3)---------------------
Start dump data blocks tsn: 1 file#: 2 minblk 664 maxblk 664
buffer tsn: 1 rdba: 0x00800298 (2/664)
scn: 0x0000.00ed6bc1 seq: 0x0d flg: 0x00 tail: 0x6bc1020d
frmt: 0x02 chkval: 0x0000 type: 0x02=KTU UNDO BLOCK

********************************************************************************

UNDO BLK:
xid: 0x0009.000.0000005b  seq: 0x10d cnt: 0xc   irb: 0xc   icl: 0x0   flg: 0x0000

 Rec Offset      Rec Offset      Rec Offset      Rec Offset      Rec Offset
---------------------------------------------------------------------------
0x01 0x077c     0x02 0x0720     0x03 0x06c8     0x04 0x066c     0x05 0x0610
0x06 0x05b4     0x07 0x0558     0x08 0x0500     0x09 0x04a4     0x0a 0x0448
0x0b 0x03f0     0x0c 0x0394     

*-----------------------------
* Rec #0x1  slt: 0x00  objn: 5448(0x00001548)  objd: 5448  tblspc: 3(0x00000003)
*       Layer:  11 (Row)   opc: 1   rci 0x00
Undo type:  Regular undo    Begin trans    Last buffer split:  No
Temp Object:  No
Tablespace Undo:  No
rdba: 0x00000000
*-----------------------------
uba: 0x00000000.0000.00 ctl max scn: 0x0000.00ed6b83 prv tx scn: 0x0000.00ed6b83
KDO undo record:
KTB Redo
op: 0x03  ver: 0x01
op: Z
KDO Op code: URP  xtype: XA  bdba: 0x0100f182  hdba: 0x0100f181
itli: 1  ispac: 0  maxfr: 1177
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 0
ncol: 8 nnew: 1 size: 1
col  1: [ 5]  53 4d 49 54 48
-------------------------------------------------------------------------------------

今回の内容は、ダンプばかりではあったが、これらの関係をしっかり抑えるこ
とで、より深くトランザクションの仕組みが理解できるはずである。

次回は、読み取り一貫性の仕組みについて、これらの知識を踏まえて説明する。

以上 BOSEのスピーカーっていい音出るよね。 茅ヶ崎にて