ITPub博客

首页 > 数据库 > Oracle > ITL事务槽记载-01

ITL事务槽记载-01

原创 Oracle 作者:dotaddjj 时间:2011-10-24 01:14:39 0 删除 编辑

前面有记载过关于块清除的blog,发现自己还是不太理解,又翻看了一些资料。还是要做一点别的知识的准备!

借鉴网络上的前辈的ITL记载,了解一下关于oracle中的ITL

ITL:Interested transaction list也就是事务槽,记得oracle concept中第二篇关于数据块 扩展 段的介绍中就提到了数据块的结构:块头,表目录,行目录,数据行,可用空间区。

首先我们dump一个数据块吧

select file_id,block_id from dba_extents where segment_name='TT02'

4 2009

由于段空间自动管理中extent是用位图来管理block的使用 空闲信息的,所以这里我们选择第四块也就是2012 数据块

Alter system dump datafile 4 block max 2012 block min 2012

部分信息:

Start dump data blocks tsn: 4 file#: 4 minblk 2012 maxblk 2012

buffer tsn: 4 rdba: 0x010007dc (4/2012)

scn: 0x0000.0024a014 seq: 0x02 flg: 0x04 tail: 0xa0140602

frmt: 0x02 chkval: 0x418c type: 0x06=trans data

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x08CA8400 to 0x08CAA400

。。。。。。

Block header dump: 0x010007dc

Object id on Block? Y

seg/obj: 0xe8bc csc: 0x00.24a013 itc: 3 flg: E typ: 1 - DATA

brn: 0 bdba: 0x10007d9 ver: 0x01 opc: 0

inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc

0x01 0x0009.012.000002ee 0x00800090.02a5.2e ---- 1 fsc 0x0000.00000000

0x02 0x0001.01a.00000267 0x00800b2d.02c1.17 ---- 1 fsc 0x0000.00000000

0x03 0x0007.01b.0000026f 0x00801be6.01dc.08 ---- 1 fsc 0x0000.00000000

可以发现在最后的block header dump中记录了block中的可用空间区的事务槽的信息(黑体字部分),其中包括scn,undo地址也就是UBa(这个是consistant read的基础),事务信息XID,事务影响该block的条数LCK,事务信息flag。

block也会scn信息,一个ITL对应一个scn,但是由于一个事务可能会改变多个数据块,所以一个事务可能会在多个数据块中产生ITL信息。

一条sql语句oracle如何找出数据块得到结果的,其实在于ITL中记录的scn和Uba。一个sql语句oracle先记录查询开始的scn,然后在buffer cache中查找需要的block或者从磁盘读入buffer cache然后再在buffer cache找查找,如果此时别的session修改了数据或正在修改数据,就会在相应的block上记录ITL,ITL中会有scn uba lock等。此时oracle发现ITL中记录的scn大于select时刻的scn,那么oracle就会根据ITL中的Uba找到undo信息获得block的前镜像,然后在buffer cache构造出CR块,此时oracle也会检查构造出的block中记录的ITL的scn,如果scn还大于select时刻的scn,那么就一直重复构造前镜像,然后oracle找到前镜像block中的ITL的scn是否还小于select时刻的scn,(同时检查事务是否提交完成)如果没有继续构造前镜像,直到找到需要的block为止,当然如果在前镜像中无法找到所需的undo信息。其实也就是经常提到的ora-01555快照过旧,此时也就是oracle多版本的本质,一个select语句总是会看到consistant gets了,但是cr块可以产生也可以不产生。

前些天提到了create table的命令,能写全真不容易

Create table tt03(a number,b number)

Pctfree 0

Initrans 2

Maxtrans 255

Storage(

initial 100K

next 100K

minextent 1

maxextent unlimited

pctincrease 0)

指定了表段的参数,其中的pctfree用于多少空间更新数据块内的已有数据,initrans参数指定数据块内的初始分配的事务槽,默认初始是2,最大上限maxtrans是255(不过在10G

该参数就被忽略)

10g中默认的pctfree为10,如果pctfree设置较小,很可能在更新数据块内的数据时导致数据块无法容纳,进而产生行迁移,当查询数据时会扫描更多的数据块影响性能。

既然说到了pctfree参数记得以前查看oracle concept中有过下面的记录

关于数据块的可用空间区的事务条目:

其中oracle concept中就提到了如果此数据块属于索引,簇表或表的数据段时,在其可用空间区还可能存储事务条目。此数据块中数据行row正在dml语句访问时,此数据块中就需要保存事务条目

此时如果创建一个pctfree为0的表段,由于初始分配的initrans只是2,如果多于三个事务很自然的会发生征用ITL的情况。

Create table tt05(id numer) pctfree 0

declare

i number;

begin

for i in 1..1000 loop

insert into tt05 values(i);

commit;

end loop;

end;

session A:

update tt05 set id=30 where id<30 and id>20

session B:

update tt05 set id=20 where id<20 and id>10

session C:

update tt05 set id=10 where id>10

session C会出现等待,session A和session B要都占用了一个事务槽,此时由于pctfree参数为0无法分配ITL给session c,必须等待前面的用完了才能回收使用。

由于对块清除 事务槽回滚段的理解还是不够清晰,这段时间会继续找资料加深自己理解也会更新blog,晚了 睡了!

[@more@]

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

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662983