Oracle深入Undo探究

PiscesCanon發表於2017-05-28
2017.03.19的實驗探究,這裡補上

實驗目的:
1.找到事務修改的資料行所在的檔案號、資料塊
2.找到事務所用的回滾段段名
3.找到undo塊(檔案號、資料塊),有兩種方式找到undo,驗證兩個方式的結果是否一致
4.分解Xid、Uba的含義

環境說明:
1.作業系統版本
  1. [oracle@oracle ~]$ uname -a
  2. Linux oracle.example.com 2.6.32-431.el6.x86_64 #1 SMP Sun Nov 10 22:19:54 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
  3. [oracle@oracle ~]$ lsb_release -a
  4. LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
  5. Distributor ID:    RedHatEnterpriseServer
  6. Description:    Red Hat Enterprise Linux Server release 6.5 (Santiago)
  7. Release:    6.5
  8. Codename:    Santiago
2.資料庫版本
  1. SYS@proc> select * from v$version where rownum=1;

  2. BANNER
  3. --------------------------------------------------------------------------------
  4. Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

實驗過程:
1.開始一個事務,查詢事務相關資訊。
  1. SYS@prod> select * from t1;

  2.         ID NAME
  3. ---------- ----------
  4.          1 aaa
  5.          2 bbb
  6.          3 ccc
  7.          4 ddd
  8.          5 eee

  9. SYS@prod> update t1 set id=1 where id=1;

  10. 1 row updated.

  11. SYS@prod> select xidusn,xidslot,xidsqn,ubafil,ubablk from v$transaction;

  12.     XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK
  13. ---------- ---------- ---------- ---------- ----------
  14.          6         41       7754          2      52665    --事務前映象所在undo塊是2號檔案的52665塊
2.找出事務所在的undo段的段名和修改的行的位置,並分別轉儲
  1. SYS@prod> select * from v$rollname where usn=6;

  2.        USN NAME
  3. ---------- ------------------------------
  4.          6 _SYSSMU6$(undo段名)


  5. SYS@prod> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,t1.* from t1 where id=1;

  6.      FILE# BLOCK#     ID         NAME
  7. ---------- ---------- ---------- ----------
  8.          1 60578      1          aaa


  9. SYS@prod> alter system dump undo header '_SYSSMU6$';

  10. System altered.
  11. [oracle@oracle udump]$ ll
  12. total 16
  13. -rw-r----- 1 oracle oinstall 16159 Mar 16 19:38 prod_ora_4236.trc
  14. [oracle@oracle udump]$ mv prod_ora_4236.trc undo_header.trc
  15. [oracle@oracle udump]$ pwd
  16. /u01/app/oracle/admin/prod/udump

  17. SYS@prod> alter system dump datafile 1 block 60578;

  18. System altered.

  1. [oracle@oracle udump]$ ll
  2. total 20
  3. -rw-r----- 1 oracle oinstall 3277 Mar 16 19:43 data_block.trc
  4. -rw-r----- 1 oracle oinstall 16159 Mar 16 19:38 undo_header.trc
3.檢視data_block.trc找到如下內容
  1. Itl  Xid                 Uba                Flag Lck Scn/Fsc
  2. 0x01 0x0004.024.00001e21 0x0080cd28.0192.2d C--- 0   scn 0x0000.016938ac
  3. 0x02 0x0006.029.00001e4a 0x0080cdb9.01f7.03 ---- 1   fsc 0x0000.00000000
  4. 0x03 0x000a.00b.00001e16 0x0080c822.023a.15 C--- 0   scn 0x0000.016938a1

  5. data_block_dump,data header at 0xdff1474
  6. ===============
  7. ...省略部分內容...
  8. block_row_dump:
  9. tab 0, row 0, @0x1f7e
  10. tl: 10 fb: --H-FL-- lb: 0x2 cc: 2             --表示事務為0x02
  11. col 0: [ 2] c1 02
  12. col 1: [ 3] 61 61 61     --對比下邊第5步驟
  13. tab 0, row 1, @0x1f74
  14. tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
  15. col 0: [ 2] c1 03
  16. col 1: [ 3] 62 62 62
  17. tab 0, row 2, @0x1f6a
  18. tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
  19. col 0: [ 2] c1 04
  20. col 1: [ 3] 63 63 63
  21. tab 0, row 3, @0x1f60
  22. tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
  23. col 0: [ 2] c1 05
  24. col 1: [ 3] 64 64 64
  25. tab 0, row 4, @0x1f56
  26. tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
  27. col 0: [ 2] c1 06
  28. col 1: [ 3] 65 65 65
  29. end_of_block_dump
  30. End dump data blocks tsn: 0 file#: 1 minblk 60578 maxblk 60578
說明:Uba->0x0080cdb9.01f7.03的第一部分0080cdb9表示undo地址,下邊驗證是否和上邊已找到的undo地址是否一致。
4.驗證Uba第一部分得到的Undo是否和v$transaction.ubablk、v$transaction.ubafil一致
  1. SYS@prod> select to_number('0080cdb9','xxxxxxxx') from dual;

  2. TO_NUMBER('0080CDB9','XXXXXXXX')
  3. --------------------------------
  4.                          8441273

  5. SYS@prod> select dbms_utility.data_block_address_file(8441273) from dual;

  6. DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(8441273)
  7. ---------------------------------------------
  8.                                             2

  9. SYS@prod> select dbms_utility.data_block_address_block(8441273) from dual;

  10. DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(8441273)
  11. ----------------------------------------------
  12.                                          52665
  13. 對比:
  14. SYS@prod> select xidusn,xidslot,xidsqn,ubafil,ubablk from v$transaction;

  15.     XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK
  16. ---------- ---------- ---------- ---------- ----------
  17.          6         41       7754          2      52665
5.資料塊轉儲檔案中具體的行的內容
  1. SYS@proc> select dump(1,16),dump('aaa',16) from dual;

  2. DUMP(1,16)        DUMP('AAA',16)
  3. ----------------- ----------------------
  4. Typ=2 Len=2: c1,2 Typ=96 Len=3: 61,61,61
對比第3步驟裡邊文字底色紅色的部分。
6.對事務所在undo塊做dump操作
  1. SYS@prod> alter system dump datafile 2 block 52665;

  2. System altered.

  3. [oracle@oracle udump]$ mv prod_ora_4317.trc undo_block.trc
  4. [oracle@oracle udump]$ ll
  5. total 28
  6. -rw-r----- 1 oracle oinstall 3277 Mar 16 19:43 data_block.trc
  7. -rw-r----- 1 oracle oinstall 5490 Mar 16 19:59 undo_block.trc
  8. -rw-r----- 1 oracle oinstall 16159 Mar 16 19:38 undo_header.trc
7.檢視undo_block.trc,找到如下內容
  1. *-----------------------------
  2. * Rec #0x3 slt: 0x29 objn: 52640(0x0000cda0) objd: 52640 tblspc: 0(0x00000000)
  3. * Layer: 11 (Row) opc: 1 rci 0x00
  4. Undo type: Regular undo Begin trans Last buffer split: No
  5. Temp Object: No
  6. Tablespace Undo: No
  7. rdba: 0x00000000
  8. *-----------------------------
  9. uba: 0x0080cdb8.01f7.08 ctl max scn: 0x0000.01692b12 prv tx scn: 0x0000.01692ce2
  10. txn start scn: scn: 0x0000.0169351b logon user: 0
  11.  prev brb: 8441256 prev bcl: 0
  12. KDO undo record:
  13. KTB Redo
  14. op: 0x04 ver: 0x01
  15. op: L itl: xid: 0x0005.004.000009f9 uba: 0x00806335.0159.24
  16.                       flg: C--- lkc: 0 scn: 0x0000.01693517
  17. Array Update of 1 rows:
  18. tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 12
  19. ncol: 2 nnew: 1 size: 0
  20. KDO Op code: 21 row dependencies Disabled
  21.   xtype: XAxtype KDO_KDOM2 flags: 0x00000080 bdba: 0x0040eca2 hdba: 0x0040eca1
  22. itli: 2 ispac: 0 maxfr: 4863
  23. vect = 0
  24. col 0: [ 2] c1 02(資料前映象
分析:

Rec #0x3:表示第0x3條undo記錄

slt: 0x29:表示slot=0x29=41 與上面從v$transaction中查出來的一致;

    1. Itl  Xid                 Uba                Flag Lck Scn/Fsc
    2. 0x02 0x0006.029.00001e4a 0x0080cdb9.01f7.03 ---- 1   fsc 0x0000.00000000

Uba中最後的03就是表示的第幾條undo記錄,與Rec一致。

這個記錄可以到檔案undo_header.trc中找到事務表中編號為0x03的記錄(暫時看不懂)。

ITL中的Xid--0x0006.029.00001e4a分成三部分:

第一個0x0006代表段號,跟下邊的xidusn對應,此處值都為6

第二個的029代表事務槽編號為2*16+9=41,與下邊的xidslot對應

第三個代表事務表的該事務被覆蓋的次數1e4a=7754,與下邊sidsqn對應

  1. SYS@prod> select xidusn,xidslot,xidsqn,ubafil,ubablk from v$transaction;

  2.     XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK
  3. ---------- ---------- ---------- ---------- ----------
  4.          6         41       7754          2      52665


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30174570/viewspace-2140023/,如需轉載,請註明出處,否則將追究法律責任。

相關文章