`

oracle执行DML(事物过程)的深入研究(二)

阅读更多

接上一节的 oracle执行DML(事物过程)的深入研究(一)

如果要了解事务的等待现象,就需要了解事务发生时,在什么阶段、 对哪些数据、 变更为什么形式。 尤其需要了解数据块和撤销区域中的数据修改。若利用 Oracle 提供的转储功能,就能从物理角度上观察被事务所修改的数据信息。接下来通过一个简单的例子进行讨论。

我们实验如下:

 1.修改数据如下:


SQL> update test set owner='HELLO' WHERE ROWNUM=1;  
 
已更新 1 行。  
 
SQL> SELECT rowid,dbms_rowid.rowid_relative_fno(rowid) as fno,dbms_rowid.rowid_block_number(rowid) a  
s blkno from  test where rownum=1;  
 
ROWID                     FNO      BLKNO  
------------------ ---------- ----------  
AAAMuBAAEAAAHMRAAp          4      29457 

 

可以看到修改该的行数据在第4号文件第29457块上,我们dump其文件内容

SQL> alter system dump datafile 4 block 29457;

系统已更改。

Start dump data blocks tsn: 4 file#: 4 minblk 29457 maxblk 29457
buffer tsn: 4 rdba: 0x01007311 (4/29457)
scn: 0x0000.0045b9bb seq: 0x01 flg: 0x00 tail: 0xb9bb0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x07AB2200 to 0x07AB4200
...
Block header dump:  0x01007311
 Object id on Block? Y
 seg/obj: 0xcb81  csc: 0x00.1223d9  itc: 3  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1007309 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000a.026.0000023a  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0x0001.00d.00000396  0x0080072c.0119.07  --U-   41  fsc 0x1027.001226bd
0x03   0x0006.00b.00000bc6  0x0080005a.04c8.17  ----    1  fsc 0x0001.00000000
 data_block_dump,data header at 0x7ab227c
===============
tsiz: 0x1f80
hsiz: 0x9e
pbl: 0x07ab227c
bdba: 0x01007311
     76543210
flag=--------
ntab=1
nrow=70
frre=-1
fsbo=0x9e
fseo=0x37f
avsp=0x341
tosp=0x13bb
0xe:pti[0] nrow=70 offs=0
...
tab 0, row 41, @0x37f
tl: 96 fb: --H-FL-- lb: 0x3  cc: 13
col  0: [ 5]  48 45 4c 4c 4f
col  1: [23]
 2f 33 64 37 30 62 62 33 36 5f 50 6f 6c 69 63 79 43 68 65 63 6b 65 72
col  2: *NULL*
col  3: [ 4]  c3 02 04 54
col  4: *NULL*
col  5: [ 7]  53 59 4e 4f 4e 59 4d
col  6: [ 7]  78 69 08 1e 0f 11 05
col  7: [ 7]  78 69 08 1e 0f 11 05
col  8: [19]  32 30 30 35 2d 30 38 2d 33 30 3a 31 34 3a 31 36 3a 30 34
col  9: [ 5]  56 41 4c 49 44
col 10: [ 1]  4e
col 11: [ 1]  4e
col 12: [ 1]  4e
tab 0, row 42, @0xe44
tl: 98 fb: --H-FL-- lb: 0x0  cc: 13
col  0: [ 3]  53 59 53
col  1: [24]
 2f 37 36 38 65 65 38 61 30 5f 50 6f 6c 69 63 79 4e 6f 64 65 49 6d 70 6c
col  2: *NULL*
col  3: [ 4]  c3 02 04 55
col  4: *NULL*
col  5: [10]  4a 41 56 41 20 43 4c 41 53 53
col  6: [ 7]  78 69 08 1e 0f 11 05
col  7: [ 7]  78 69 08 1e 0f 11 05
col  8: [19]  32 30 30 35 2d 30 38 2d 33 30 3a 31 34 3a 31 36 3a 30 34
col  9: [ 5]  56 41 4c 49 44
col 10: [ 1]  4e
col 11: [ 1]  4e
col 12: [ 1]  4e
...
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 29457 maxblk 29457

通过块转储文件的内容,可确认如下事实:

1 ITL 上,已经执行修改的事务在 ITL 上以 itl=0x03 登记。当前状态是尚未提交的活动的状态, 因此正在获得 TX 锁。将 Xid=0x0006.00b.00000bc6变换为十 进制就 是USN=6 SLOT=11 SQN=3014 。从 V$TRANSACTION 视图上确认当前会话相应的信息, 可以发现是完全一致的。

SQL>  select sid from v$mystat where rownum=1;  
 
       SID  
----------  
       137  
 
SQL> select xidusn,xidslot,xidsqn from v$transaction where addr=(select taddr from v$session where s   id=137);  
 
    XIDUSN    XIDSLOT     XIDSQN  
---------- ---------- ----------  
         6         11       3014                        XID=USN + SLOT + SQN  

 

 2 ITL 信息上 Lock=1 ,这代表被事务修改的行数。而且,因为尚未提交,所以 Flag 上没有设定任何值。与此相同, SCN 也未被分配。 Flag 值为 C ”或“ U ”时,就意味着已执行提交。

3 )利用 ITL UBA Undo Block Address )信息,可以掌握当前事务最近使用的撤销块和撤销记录( Record )的位置。 UBA [Undo Block DBA+Seq#+Record#] 组成,执行回滚时就要利用这些信息。

4 block_row_dump 区域上的第一行的 lb 值被设定为 0x1 lb Lock Byte 的缩写,表示当前行挂起锁的 ITL 编号。也就是说, 1 ITL 修改当前行。 Lock byte 值实际发生提交也不会被清除,最终发生 Delayed block cleanout 或因另外进程修改块时才会被清除。

 

事务和撤销块转储

在上面例子中, 若能转储已修改数据块的事务所使用的回滚段( USN=6 )的头块( header block ), 就可以确认事务相应信息是怎样被管理的。

SQL> select xidusn,xidslot,xidsqn from v$transaction where addr=(select taddr from v$session where s  
id=137);  
 
    XIDUSN    XIDSLOT     XIDSQN  
---------- ---------- ----------  
         6         11       3014                        USN=6,Slot=11  
SQL> select file_id,block_id from dba_rollback_segs where segment_id=6;  
 
   FILE_ID   BLOCK_ID  
---------- ----------  
         2         89

 

dump 2号文件89号数据块内容
SQL> alter system dump datafile 2 block 89;

系统已更改。

*** 2010-12-14 14:14:11.171
Start dump data blocks tsn: 1 file#: 2 minblk 89 maxblk 89
buffer tsn: 1 rdba: 0x00800059 (2/89)
scn: 0x0000.0045b9bb seq: 0x01 flg: 0x04 tail: 0xb9bb2601
frmt: 0x02 chkval: 0x8562 type: 0x26=KTU SMU HEADER BLOCK
...
  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 3      #blocks: 23   
                  last map  0x00000000  #maps: 0      offset: 4080 
      Highwater::  0x0080005a  ext#: 0      blk#: 0      ext size: 7    
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 0    
  mapblk  0x00000000  offset: 0    
                   Unlocked
     Map Header:: next  0x00000000  #extents: 3    obj#: 0      flag: 0x40000000
  Extent Map
  -----------------------------------------------------------------
   0x0080005a  length: 7    
   0x00800121  length: 8    
   0x00800041  length: 8    
 
 Retention Table  和flashback 功能 相关
  -----------------------------------------------------------
 Extent Number:0  Commit Time: 1292304533
 Extent Number:1  Commit Time: 1292302823
 Extent Number:2  Commit Time: 1292304533
 
  TRN CTL:: seq: 0x04c8 chd: 0x0009 ctl: 0x0023 inc: 0x00000000 nfb: 0x0000
            mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
            uba: 0x0080005a.04c8.17 scn: 0x0000.0045b3cc
Version: 0x01
  FREE BLOCK POOL::
    uba: 0x00000000.04c8.16 ext: 0x0  spc: 0x157e 
    uba: 0x00000000.04c8.03 ext: 0x0  spc: 0x1eb8 
    uba: 0x00000000.04bc.14 ext: 0x2  spc: 0x5c2  
    uba: 0x00000000.0473.20 ext: 0x1  spc: 0x1012 
    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0    
  TRN TBL::   事物表
 
  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt
  ------------------------------------------------------------------------------------------------
   ...
   0x0a    9    0x00  0x0bc7  0x001a  0x0000.0045b492  0x00800045  0x0000.000.00000000  0x00000001   0x00000000  1292303166

   0x0b   10    0x80  0x0bc6  0x0000  0x0000.0045b96e  0x0080005a  0x0000.000.00000000  0x00000001   0x00000000  0

   0x0c    9    0x00  0x0bc5  0x0029  0x0000.0045b55c  0x00800045  0x0000.000.00000000  0x00000001   0x00000000  1292303295
   ...
End dump data blocks tsn: 1 file#: 2 minblk 89 maxblk 89

 

然后我们执行commit操作。

SQL> commit;

提交完成。

从新dump 数据块内容。
SQL> alter system dump datafile 4 block 29457;

系统已更改。

Start dump data blocks tsn: 4 file#: 4 minblk 29457 maxblk 29457
buffer tsn: 4 rdba: 0x01007311 (4/29457)
scn: 0x0000.0045c06a seq: 0x01 flg: 0x02 tail: 0xc06a0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
...
Block header dump:  0x01007311
 Object id on Block? Y
 seg/obj: 0xcb81  csc: 0x00.1223d9  itc: 3  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1007309 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000a.026.0000023a  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0x0001.00d.00000396  0x0080072c.0119.07  --U-   41  fsc 0x1027.001226bd
0x03   0x0006.00b.00000bc6  0x0080005a.04c8.17  --U-    1  fsc 0x0001.0045c06a    -FLAG 变为 U(upper bound commit)提交状态
 
data_block_dump,data header at 0x7ab227c
===============
tsiz: 0x1f80
hsiz: 0x9e
pbl: 0x07ab227c
bdba: 0x01007311
     76543210
flag=--------
ntab=1
nrow=70
frre=-1
fsbo=0x9e
fseo=0x37f
avsp=0x341
tosp=0x13bb

tab 0, row 41, @0x37f
tl: 96 fb: --H-FL-- lb: 0x3  cc: 13
col  0: [ 5]  48 45 4c 4c 4f
col  1: [23]
 2f 33 64 37 30 62 62 33 36 5f 50 6f 6c 69 63 79 43 68 65 63 6b 65 72
col  2: *NULL*
col  3: [ 4]  c3 02 04 54
col  4: *NULL*
col  5: [ 7]  53 59 4e 4f 4e 59 4d
col  6: [ 7]  78 69 08 1e 0f 11 05
col  7: [ 7]  78 69 08 1e 0f 11 05
col  8: [19]  32 30 30 35 2d 30 38 2d 33 30 3a 31 34 3a 31 36 3a 30 34
col  9: [ 5]  56 41 4c 49 44
col 10: [ 1]  4e
col 11: [ 1]  4e
col 12: [ 1]  4e
tab 0, row 42, @0xe44
tl: 98 fb: --H-FL-- lb: 0x0  cc: 13
col  0: [ 3]  53 59 53
col  1: [24]
 2f 37 36 38 65 65 38 61 30 5f 50 6f 6c 69 63 79 4e 6f 64 65 49 6d 70 6c
col  2: *NULL*
col  3: [ 4]  c3 02 04 55
col  4: *NULL*
col  5: [10]  4a 41 56 41 20 43 4c 41 53 53
col  6: [ 7]  78 69 08 1e 0f 11 05
col  7: [ 7]  78 69 08 1e 0f 11 05
col  8: [19]  32 30 30 35 2d 30 38 2d 33 30 3a 31 34 3a 31 36 3a 30 34
col  9: [ 5]  56 41 4c 49 44
col 10: [ 1]  4e
col 11: [ 1]  4e
col 12: [ 1]  4e
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 29457 maxblk 29457

dump undo数据块的内容
SQL> alter system dump datafile 2 block 89;

系统已更改。

Start dump data blocks tsn: 1 file#: 2 minblk 89 maxblk 89
buffer tsn: 1 rdba: 0x00800059 (2/89)
scn: 0x0000.0045c156 seq: 0x02 flg: 0x00 tail: 0xc1562602
frmt: 0x02 chkval: 0x0000 type: 0x26=KTU SMU HEADER BLOCK

  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 3      #blocks: 23   
                  last map  0x00000000  #maps: 0      offset: 4080 
      Highwater::  0x0080005b  ext#: 0      blk#: 1      ext size: 7    
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 0    
  mapblk  0x00000000  offset: 0    
                   Unlocked
     Map Header:: next  0x00000000  #extents: 3    obj#: 0      flag: 0x40000000
  Extent Map
  -----------------------------------------------------------------
   0x0080005a  length: 7    
   0x00800121  length: 8    
   0x00800041  length: 8    
 
 Retention Table
  -----------------------------------------------------------
 Extent Number:0  Commit Time: 1292304533
 Extent Number:1  Commit Time: 1292302823
 Extent Number:2  Commit Time: 1292304533
 
  TRN CTL:: seq: 0x04c8 chd: 0x000a ctl: 0x0011 inc: 0x00000000 nfb: 0x0001
            mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
            uba: 0x0080005b.04c8.0d scn: 0x0000.0045b480
Version: 0x01
  FREE BLOCK POOL::
    uba: 0x0080005b.04c8.0e ext: 0x0  spc: 0x18d2 
    uba: 0x00000000.04c8.03 ext: 0x0  spc: 0x1eb8 
    uba: 0x00000000.04bc.14 ext: 0x2  spc: 0x5c2  
    uba: 0x00000000.0473.20 ext: 0x1  spc: 0x1012 
    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0    
  TRN TBL::
 
  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt
  ------------------------------------------------------------------------------------------------
   0x0b    9    0x00  0x0bc6  0x0009  0x0000.0045c06a  0x0080005a  0x0000.000.00000000  0x00000001   0x00000000  1292307799
  
End dump data blocks tsn: 1 file#: 2 minblk 89 maxblk 89

 

 

 

 

 

分享到:
评论

相关推荐

    Oracle DDL,DML,DCL,TCL 基础概念

    ### Oracle DDL、DML、DCL、TCL 基础概念 #### DDL (Data Definition Language) 数据定义语言 数据定义语言(DDL)主要用于创建、修改或删除数据库对象,如表、索引、视图等。这些操作通常涉及数据库结构的变更。 ...

    Oracle DML触发器的执行顺序.pdf

    Oracle DML 触发器的执行顺序 Oracle 中的 DML 触发器是一种存储在数据库中的 PL/SQL 块,能够自动响应特定事件,以实现一些复杂的业务规则。DML 触发器可以分为三种基本类型:数据操纵语句 (DML) 触发器、数据定义...

    oracle操作数据-DML语句.pptx

    oracle操作数据-DML语句.pptx

    oracle动态过程执行

    ### Oracle 动态 SQL 执行详解 在 Oracle 数据库中,动态 SQL 提供了一种灵活的方式来执行不预先定义好的 SQL 语句。这种方式允许开发者在运行时构建 SQL 语句并执行它们,这对于处理未知数据结构或需要动态生成...

    Oracle OLAP DML Reference 11g Release 2 (11.2)-1640

    4. **计算与表达式**:OLAP DML支持复杂的计算表达式,可以定义成员公式(member formulas)来执行计算,例如平均值、总和、比率等。用户还可以创建自定义函数,扩展OLAP DML的功能。 5. **安全性与权限**:文档会...

    Oracle DML触发器在数据库编程中的应用.pdf

    Oracle DML 触发器是一种特殊类型的存储过程,它可以自动执行 SQL 和 PL/SQL 语句,以响应数据库中的变化。触发器可以在数据库表中的数据变化之前或之后执行,也可以在每个变化行或语句执行一次。 Oracle 允许对一个...

    在SELECT语句中调用DML函数

    然而,直接在函数中执行DML操作会触发Oracle的错误ORA-14551,这是因为函数内部的DML操作默认是在当前事务中执行的,而SELECT语句不能在同一个事务中同时包含DML操作。 为了解决这个问题,需要在函数中声明`pragma ...

    oracleDML触发器1.ppt

    Oracle DML触发器是数据库管理系统Oracle中的一种特性,它允许开发者在特定的数据操作语言(DML)事件(如INSERT、UPDATE、DELETE)发生时自动执行一段PL/SQL代码。DML触发器主要用于实现数据完整性、业务规则的强制...

    oracleDML触发器.pptx

    Oracle DML触发器是数据库管理系统Oracle中的一种重要特性,它允许在特定的数据操作语言(DML)事件(如INSERT、UPDATE、DELETE)发生时自动执行PL/SQL代码块。本篇将详细介绍Oracle DML触发器的相关知识。 1. **...

    oracleDML触发器.ppt

    Oracle DML 触发器是 Oracle 中的一种机制,它可以在特定的事件发生时自动执行某些操作。触发器可以分为 DML 触发器、系统事件触发器、用户事件触发器、管理触发器等几种。 触发器的组成部分包括触发器名称、触发器...

    Oracle执行计划介绍与测试.pdf

    ### Oracle执行计划深入解析 #### 引言 在数据库领域,尤其对于大型企业级应用,Oracle数据库因其强大的功能和稳定性而被广泛采用。在Oracle中,执行计划是数据库优化器根据SQL语句特性生成的一系列步骤,用于指导...

    oracle高级语法(事物、函数、存储过程、触发器、异常)[参照].pdf

    事务是 Oracle 数据库中的一组操作单元,事务可以包含多个 DML 语句,例如插入、更新、删除等。事务的特点是要么全部成功,要么全部失败。事务可以确保数据的一致性和完整性。 事务的类型有两种:读事务和写事务。...

    Oracle触发器与存储过程高级编程-第3版itpub.rar

    《Oracle触发器与存储过程高级编程》第3版是一本深入探讨Oracle数据库中触发器和存储过程技术的专业书籍。在Oracle数据库系统中,触发器和存储过程是数据库管理员和开发人员进行复杂业务逻辑处理和数据管理的重要...

    oracle操作数据DML语句.ppt

    Oracle 操作数据 DML 语句 Oracle 操作数据 DML 语句是 Database Management System(数据库管理系统)中的一种基本语言,用于操作和管理数据库中的数据。DML 语句是 Data Manipulation Language(数据操作语言)...

    ORACLE执行计划和SQL调优.pptx

    ORACLE 执行计划和 SQL 调优 ORACLE 执行计划和 SQL 调优是关系数据库管理系统中非常重要的概念。执行计划是 Oracle 优化器生成的,用于描述如何访问数据库中的数据的计划。execute plan 中包括了访问路径、表扫描...

Global site tag (gtag.js) - Google Analytics