当前位置:  数据库>oracle

Oracle ITL(Interested Transaction List) 说明

    来源: 互联网  发布时间:2017-04-05

    本文导语: 一.  ITL 说明        ITL: Interested Transaction List,也叫事务槽,它位于BLOCK Header。 先dump 一个block,看一下这个ITL 的信息。   /* Formatted on 2011/6/28 20:53:05 (QP5 v5.163.1008.3004) */   SELECT a.segment_name,          a.extent_id,         ...

一.  ITL 说明

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

 

/* Formatted on 2011/6/28 20:53:05 (QP5 v5.163.1008.3004) */

  SELECT a.segment_name,

         a.extent_id,

         a.file_id,

         a.block_id,

         a.blocks,

         b.name

    FROM dba_extents a, v$datafile b

   WHERE segment_name = ''TA'' AND a.file_id = b.file# AND ROWNUM SELECT file#, name FROM v$datafile;

 

       当某个对象比较大时,占用的block 也就会很多,Oracle 的存储结构是segment -->extent-->block.  每个extent 由一些block组成。 在上面的示例中每个extent 由8个blocks 组成。

 

我们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.

 

       有关这个问题,参考我之前的Blog:

       Oracle 实例恢复时 前滚(roll forward) 后滚(roll back) 问题

      

 

       RedoLog Checkpoint 和 SCN关系

      

      

      

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

 

       有关CR,参考Blog:

       CR (consistent read) blocks create 说明

      

 

       当用户发出一条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 也会检查构造出来的BLOCK中ITL记录的SCN,如果SCN还大于select时刻的SCN,那么一直重复构造前镜像,然后ORACLE找到前镜像BLOCK中的ITL的SCN是否小于select的SCN,同时检查这个事物有没有提交或者回滚,如果没有,那么继续构造前镜像,直到找到需要的BLOCK,如果在构造前镜像的过程中所需的UNDO信息被覆盖了,就会报快照过旧的错误,这样ORACLE就实现了多版本,这就是ORACLE多版本的本质,我们现在也知道了为什么发出一条select 语句总是会看到consistant gets了。

 

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

 

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

      PCTFREE: =BLOCK中空闲的大小/BLOCK总大小*100

      

       10g中默认的pctfree为10,ORACLE会为一个BLOCK保留10%的空间以确保将来对于BLOCK中的数据的更新,如果这个值设置过小,可能会产生行迁移,导致性能下降.

 

下面做个试验,验证ITL与PCTFREE的关系

 

SYS@anqing2(rac2)> create table t1(a number,b varchar2(20)) pctfree 0;

Table created.

 

SYS@anqing2(rac2)> begin

  2  for i in 1..1000 loop

  3  insert into t1 values(i,''DBA'');

  4  end loop;

  5  commit;

  6  end;

  7  /

PL/SQL procedure successfully completed.

 

SYS@anqing2(rac2)> select distinct dbms_rowid.rowid_block_number(rowid) from t1;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)

------------------------------------

                               73546

                               73547

 

由此可知t1表占用了2个block.

 

 

Session 1 中操作:

SYS@anqing2(rac2)> update t1 set b=''I am DBA'' where a update t1 set b=''I am DBA'' where a>10 and a update t1 set b=''I am DBA'' where a>20 and a select event from v$session_wait where event like ''%ITL%'';

 

EVENT

----------------------------------------------------------------

enq: TX - allocate ITL entry

 

       此时出现了分配ITL条目的等待,因为PCTFREE为0,BLOCK中没有足够空间分配ITL,ORACLE只能重用ITL,但是这个时候由于没有COMMIT,无法重用ITL,所以会出现allocate ITL 等待事件,要解决此类问题,可以从新创建表,增大PCTFREE的值,或者更改应用设计,减少竞争。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle新手教程 手工创建数据库的全部脚本及说明
  • 求详细linux(redhed9)上安装oracle9i的说明书?
  • ORACLE 中几个难以理解的概念说明
  • Oracle数据库异构服务原理及实例说明
  • ORACLE实现字段自增示例说明
  • Oracle中手工创建数据库的全部脚本与说明
  • Oracle 高速批量数据加载工具sql*loader使用说明
  • Oracle 数据库导出(exp)导入(imp)说明
  • 关于Oracle 数据库的配置方案说明
  • Oracle 启动例程 STARTUP参数说明
  • Oracle 语句优化分析说明第1/2页
  • oracle iSQL*PLUS配置设置图文说明
  • oracle常用数据类型说明
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • NOSQL iis7站长之家
  • Linux系统下Oracle的启动与Oracle监听的启动


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3