ITPub博客

首页 > Linux操作系统 > Linux操作系统 > (转)Oracle 中DML深入研究

(转)Oracle 中DML深入研究

原创 Linux操作系统 作者:xz43 时间:2011-01-26 16:47:15 0 删除 编辑

    用户所执行的DML(即执行事务)操作在Oracle内部按如下顺序进行:

1、相应事务分配回滚段(undo segment),这时优先使用当前联机状态的回滚段中一个。回滚段的选择是随机的,若另外的事务正在使用则重试 3 次,在此过程中失败,则将未联机的回滚段联机后使用。如果此过程也失败,就会创建新的回滚段,通过这个过程也没有分配到回滚段,则使用Oracle 8i 中使用的回滚段(rollback segment)算法,即使用另外事务使用中的回滚段中用量最少的回滚段。如果服务器进程在获得回滚段时没有适当的联机状态的回滚段,则等待 enq:US-contention 事件,直到有适当的联机状态的回滚段为止。

2、分配回滚段后,在回滚段头上创建事务表Slottransaction table slot)。

3、创建事务表后会生成TXIDTransaction ID),再将此TXID 分配给当前事务。TXID 通过V$TRANSACTION 视图的XIDUSN XIDSLOT XIDSQN 表现,这个值指向分给事务的回滚段头上存在的事务表的准确位置。事务必须在分配撤销区域后得到TXID

4、事务对象的数据块载入到高速缓冲区,在块头的 ITLInterested Transaction List)上登记事务条目(transaction entry)。如果ITL 上没有登记条目所需的空间,直到有空间为止,一直等待 enq : TX-allocate ITL entry 事件。

5、将需要修改的块的修改信息存储到PGA ,存储名为Change Vector 。修改一行时,一般分别创建撤销头块(change vector#1)、撤销块(change vector#2)、数据块(change vector#3)相应的change vector。进程将PGA change vector以名为redo record(或redo entry)复制到重做缓冲区。在复制到重做缓冲区的过程中,需获得redo copy锁存器、redo allocation 锁存器、redo writing 锁存器,在此过程中若发生锁存器争用,分别等待latch: redo copy latch: redo allocation latch: redo writing 事件。

6、将之前映像信息(before image)记录到撤销块,继而修改数据块,被修改的数据块变为脏状态。而且,高速缓冲区上创建关于已修改的数据块的CRconsistent read)块。如果需修改的行正在被另外事务所改变(即,修改后事务尚未结束的状态),就要等待事务结束,此时会等待enq:TX-row lock contention 事件。

7、执行提交(commit)后给事务分配SCN ,提交信息存储在重做缓冲区。

8、回滚段头的事务表中存储已成功提交的信息,解除包括 TX 锁在内的所有资源占有。

9、重做缓冲区的内容记录在重做日志文件上,修改的块之后被DBWR 录到数据文件中。

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

1.修改数据如下:


SQL> update test set wner='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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9399028/viewspace-686340/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-11-16

  • 博文量
    420
  • 访问量
    1744042