ITL(Interested Transaction List)sql
ITL是位於數據塊頭部的事物槽列表,它是由一系列的ITS(Interested Transaction Slot,事物槽)組成,其初始的ITL Slot數量由INITRANS決定的,若是有足夠的剩餘空間,oracle也會根據須要動態的分配這些slot,直到受到空間限制或者達到MAXTRANS,注意10g之後MAXTRANS被廢棄,默認爲255。oracle
ITL裏的信息包括了xid,uba,flag,lck和scn/fsc,它是用來記錄數據塊上發生的事務相關信息,其中xid表示事物的id,uba表示對應到undo塊上的地址,flag用來表示該條事務的狀態,lck是塊上的鎖標記等。app
咱們使用dump命令來認識一下itl裏的內容:this
SQL> conn /as sysdba Connected. SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production PL/SQL Release 11.2.0.1.0 - Production CORE 11.2.0.1.0 Production TNS for Linux: Version 11.2.0.1.0 - Production NLSRTL Version 11.2.0.1.0 - Production SQL> conn scott/tiger Connected. SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) fno, 2 dbms_rowid.rowid_block_number(rowid) block_id, 3 dbms_rowid.rowid_row_number(rowid) 4 from dept; ROWID FNO BLOCK_ID DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) ------------------ ---------- ---------- ---------------------------------- AAAR3bAAEAAAACHAAA 4 135 0 AAAR3bAAEAAAACHAAB 4 135 1 AAAR3bAAEAAAACHAAC 4 135 2 AAAR3bAAEAAAACHAAD 4 135 3 SQL> update dept set dname='development' where deptno=10; 1 row updated. --注意未提交
--另開一個會話url
[oracle@std ~]$ sqlplus scott/tiger SQL*Plus: Release 11.2.0.1.0 Production on Fri Oct 16 15:24:12 2015 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> update dept set dname='AAAAA' where deptno=40; 1 row updated. SQL> commit; Commit complete. SQL> conn /as sysdba Connected. SQL> alter system dump datafile 4 block 135; System altered. SQL> oradebug setmypid Statement processed. SQL> oradebug tracefile_name /u02/app/diag/rdbms/orcl/ORCL/trace/ORCL_ora_7978.trc
查看一下dump出來的內容:spa
more /u02/app/diag/rdbms/orcl/ORCL/trace/ORCL_ora_7978.trc ...... Block header dump: 0x01000087 Object id on Block? Y seg/obj: 0x11ddb csc: 0x00.105858 itc: 2 flg: E typ: 1 - DATA brn: 0 bdba: 0x1000080 ver: 0x01 opc: 0 inc: 0 exflg: 0 Itl Xid Uba Flag Lck Scn/Fsc 0x01 0x0001.010.00000198 0x00c15aac.0061.36 C--- 0 scn 0x0000.000b6f31 0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 bdba: 0x01000087 data_block_dump,data header at 0xcac664
能夠看到dump出來的內容包括了事務id,對應的undo地址,事務的狀態,鎖信息等,經過這些信息就能夠標識當前數據塊的DML狀況。debug
理解flg標識位含義:rest
---- = transaction is active, or committed pending cleanout
C--- = transaction has been committed and locks cleaned out
-B-- = this undo record contains the undo for this ITL entry
--U- = transaction committed (maybe long ago); SCN is an upper bound
---T = transaction was still active at block cleanout SCNcode
------ITL在ORACLE中的使用blog
當發出一條sql語句時,ORACLE會記錄下這個時刻(SCN),而後在buffer cache中查找須要的BLOCK,或者從磁盤上讀。當別的會話修改了數據,或者正在修改數據,就會在相應的block上記錄ITL,此時ORACLE發現ITL中記錄的SCN(Scn/Fsc)大於SELECT時刻的SCN,那麼ORACLE就會根據ITL中的Uba找到UNDO信息得到該block的前鏡像,而後在buffer cache 中構造出CR(consistent read)塊,此時ORALCE也會檢查構造出來的BLOCK中ITL記錄的SCN(Scn/Fsc),若是SCN(Scn/Fsc)還大於select時刻的SCN,那麼一直重複構造前鏡像,而後ORACLE找到前鏡像BLOCK中的ITL的SCN是否小於select的SCN,同時檢查這個事物有沒有提交或者回滾,若是沒有,那麼繼續構造前鏡像,直到找到須要的BLOCK,若是在構造前鏡像的過程當中所需的UNDO信息被覆蓋了,就會報ORA-01555快照過舊的錯誤。
參考:http://wenku.baidu.com/link?url=Pp9XTyF_4rYzhdNOeewFhmp_YAoVS1Pq8FJYvOy1_DS10DWIWreYDSLDpGwLhibjFO6SYGunPcvZ_aTP1P5fZzFCbw0m7qwXCT4EMYMSBpK