Orace ITL(Interested Transaction List) 说明(一)

2014-11-24 18:19:22 · 作者: · 浏览: 0

. ITL 说明



ITL: Interested Transaction List,也叫事务槽,它位于BLOCK Header dump 一个block,看一下这个ITL 的信息。




SELECTa., extent_id


a., block_id


a.blocks, b


FROMa, segment_name file_id bfile# ;SELECT,nameFROM;




我们dump 其中的一个Block:


SYS@anqing2(rac2)> alter system dump datafile 1 block 71553;


System altered.


SYS@anqing2(rac2)> oradebug setmypid


Statement processed.


SYS@anqing2(rac2)> oradebug tracefile_name


/u01/app/oracle/admin/anqing/udump/anqing2_ora_9114.trc



DUMP 的部分内容:


[oracle@rac2 ~]$ cat /u01/app/oracle/admin/anqing/udump/anqing2_ora_9114.trc


/u01/app/oracle/admin/anqing/udump/anqing2_ora_9114.trc


Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production


With the Partitioning, Real Application Clusters, OLAP, Data Mining


and Real Application Testing options


ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1


System name: Linux


Node name: rac2


Release: 2.6.18-194.el5


Version: #1 SMP Tue Mar 16 21:52:43 EDT 2010


Machine: i686


Instance name: anqing2


Redo thread mounted by this instance: 2


Oracle process number: 35


Unix process pid: 9114, image: oracle@rac2 (TNS V1-V3)



*** ACTION NAME:() 2011-06-28 21:06:13.112


*** MODULE NAME:(sqlplus@rac2 (TNS V1-V3)) 2011-06-28 21:06:13.112


*** SERVICE NAME:(SYS$USERS) 2011-06-28 21:06:13.112


*** SESSION ID:(141.4638) 2011-06-28 21:06:13.112


Start dump data blocks tsn: 0 file#: 1 minblk 71553 maxblk 71553


buffer tsn: 0 rdba: 0x00411781 (1/71553)


scn: 0x0000.0049ee36 seq: 0x01 flg: 0x04 tail: 0xee360601


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


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


Dump of memory from 0x0E862400 to 0x0E864400


......


E8643F0 C3040200 04036002 65766164 EE360601 [.....`..dave..6.]


Block header dump: 0x00411781


Object id on Block Y


seg/obj: 0xd5ec csc: 0x00.49ee29 itc: 3 flg: - typ: 1 - DATA


fsl: 0 fnx: 0x0 ver: 0x01



Itl Xid Uba Flag Lck Scn/Fsc


0x01 0x000e.007.00000236 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000


0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000


0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000



可以看到ITL包含了SCN,undo地址,事物信息,事物影响该block的条数。



从上面的信息可以看到block中也会记录SCN的信息每个ITL对应一个SCN由于一个事物的操作可能会涉及到多个BLOCK的更改,所以一个事物可能在多个BLOCK中产生ITL信息



一般来说,SCN 会保存在4个地方,控制文件中有三个,还有一个在datafile header.



有关这个问题,参考





ITL中另外一个相当重要的就是Uba,它记录了UNDO的信息,这个是consistant read的基础。



有关CR,参考



当用户发出一条SQL语句,ORACLE就知道了它的结果,其实原因就在于ITL中记录的SCN,Uba. 当发出一条sql语句时,ORACLE会记录下这个时刻(SCN),然后在buffer cache中查找需要的BLOCK,或者从磁盘上读,当别的会话修改了数据,或者正在修改数据,就会在相应的block上记录ITL,此时ORACLE发现ITL中记录的SCN大于SELECT时刻的SCN那么ORACLE就会根据ITL中的Uba找到UNDO信息获得该block的前镜像,然后在buffer cache 中构造出CR,此时ORALCE 也会检查构造出来的BLOCKITL记录的SCN,如果SCN还大于select时刻的SCN,那么一直重复构造前镜像,然后ORACLE找到前镜像BLOCK中的ITLSCN是否小于selectSCN,同时检查这个事物有没有提交或者回滚,如果没有,那么继续构造前镜像,直到找到需要的BLOCK如果在构造前镜像的过程中所需的UNDO信息被覆盖了,就会报快照过旧的错误,这样ORACLE就实现了多版本,这就是ORACLE多版本的本质,我们现在也知道了为什么发出一条select 语句总是会看到consistant gets了。



ITL也是要占用空间的,它存在于block 头部。在ORACLE10g中,如果建表的时候不指定initrans参数,那么默认的itl数为2,最大上限为255,同时指定maxtrans参数会被忽略(9i中有效),在BLOCK有足够空间的情况下,ORACLE会在需要的情况下自动分配ITL



对于热点表,可以适当设置较大的pctfree,以保证ORACLE能够有足够空间分配ITL


PCTFREE =BLOCK中空闲的大