ロールバック・セグメントに関する検証 その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のスピーカーっていい音出るよね。 茅ヶ崎にて