|
接着讨论一下这个话题,下面是我获取的APPEND INSERT期间的undo信息:
*-----------------------------
* Rec #0x19 slt: 0x04 objn: 13697(0x00003581) objd: 13697 tblspc: 4(0x00000004)
* Layer: 13 (Transasction Segment) opc: 29 rci 0x18
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
Segment Header Undo
Seghdr dba: 0x0100055b Mapblock dba: 0x00000000 Mapredo Offset: 2 scls: 4 mcls: 0
Low HWM
Highwater:: 0x01000561 ext#: 0 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 8
mapblk 0x00000000 offset: 0
lfdba: 0x01000559
SQL> L
1 select owner,segment_name,file_id,block_id,blocks,bytes from dba_extents
2* where owner='TEST' AND segment_name='BB'
SQL> /
OWNER SEGMENT_NAME FILE_ID BLOCK_ID BLOCKS BYTES
---------- -------------------- ---------- ---------- ---------- ----------
TEST BB 4 1369 8 65536
TEST BB 4 1377 8 65536
从上面可以看出,这仅仅是实验对象“BB”表的段头的信息,而且是APPEND INSERT 前的信息,因为从上面可以看到,"BB"INSERT前只有一个EXTENT,而INSERT 后,我从库里查到有两个EXTENT,如上面的查询及结果,因此,我们可以做如下推断:
1、在APPEND INSERT提交前,该事务获取了一个事务槽,但并未获取UNDO BLOCK,在该事务COMMIT期间,它往UNDO SEGMENT里写了以上信息,只是写了段头信息,而未写任何修改前的数据信息,即前影像,可以说它在APPEND INSERT以后和APPEND INSERT以前的数据间划了一个记号,这也许就是APPEND INSERT 后依然可以进行FLASH QUERY的原因;
2、APPEND INSERT期间会产生递归DML,但它产生的UNDO信息,应该在系统UNDO SEGMENT上,在AUM下,应该是0号段上;
3、我对上面的UNDO信息有些地方并不清楚,比如:opc:29,lfdba等,都不知道,而且查也没查到,如果有能完全看懂的朋友就好了,希望能有高手来解释这段UNDO信息,大家一起讨论。 |
|