Oracle深入Undo探究

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30174570/viewspace-2140023/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值