ITL事務槽記載-01
前面有記載過關於塊清除的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: 0x
frmt: 0x02 chkval: 0x
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: 0x
brn: 0 bdba: 0x10007d9 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0009.012.000002ee 0x
0x02 0x
0x03 0x0007.01b
可以發現在最後的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(不過在
該引數就被忽略)
既然說到了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部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055904/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle ITL (Interested Transaction List) - 事務槽OracleREST
- ITL與事務處理
- oracle ITL槽Oracle
- 事務提交時itl上flag標記U測試!
- zt_ITL Cleanout和ITL中的事務狀態分析
- 01 事務
- [20160726]行連結行遷移與ITL槽.txt
- 事務槽引起的 ORA-600 事件事件
- 推薦:深入研究ITL阻塞與ITL死鎖(轉載)
- [20160729]行連結行遷移與ITL槽4.txt
- [20160727]行連結行遷移與ITL槽2.txt
- [20160728]]行連結行遷移與ITL槽3.txt
- [20180402]行連結行遷移與ITL槽6.txt
- Spring事務筆記Spring筆記
- MySQL 筆記 - 事務&鎖MySql筆記
- SQL筆記(14)——事務SQL筆記
- STREAMS筆記(9) 大事務 & 長事務筆記
- oracle block資料塊itl小記OracleBloC
- 碰到巢狀事務-筆記巢狀筆記
- 事務、全域性索引、透明分散式,再見,分割槽健!索引分散式
- ITL
- 資料塊內事務槽不足導致資料塊鎖
- oracle實驗記錄 (事務控制)Oracle
- Calvin:分割槽資料庫系統的快速分散式事務資料庫分散式
- 十、Redis事務、事務鎖Redis
- 筆記:DB常用sql列印+事務使用筆記SQL
- 購買教材事務工作登記處
- 分散式事務之Spring事務與JMS事務(二)分散式Spring
- MySQL事務(一)認識事務MySql
- WCF服務承載(筆記)筆記
- 什麼是事務、事務特性、事務隔離級別、spring事務傳播特性?Spring
- [20120601]ITL的問題補充.txt
- 事務
- 編輯 Java 中的事務 — JDBC 事務和 JTA 事務JavaJDBC
- [高效能MYSQL學習筆記]事務MySql筆記
- 關於Spring Aop和事務記錄Spring
- MySQL事務控制語句(學習筆記)MySql筆記
- 深入研究ITL阻塞與ITL死鎖 作者 piner