關於事務對資料塊的操作過程的分析和試驗(1)(轉)
事務和資料塊
這裡主要想透過試驗來推斷Oracle的事務在資料塊(Oracle中儲存的最小單位)上一些微觀操作,以便於更好的理解Oracle的事務控制、一致性處理及鎖衝突。
建立測試表:
SQL> create table t_multiver (a number, b number);
Table created.
SQL> insert into t_multiver values (1,1);
1 row created.
SQL> insert into t_multiver values (2,2);
1 row created.
SQL> insert into t_multiver values (3,3);
1 row created.
SQL>
SQL> commit;
Commit complete.
首先,看一下資料塊上和記錄有關的標示,dump一個資料塊看看:
SQL> alter system dump datafile 5 block 50816;
System altered.
看看Dump出來的內容:
Block header dump: 0x0140c70f
Object id on Block? Y
seg/obj: 0xe46c csc: 0x00.a4462b75 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x140c709 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.020.0000192f 0x0080051a.059f.34 --U- 3 fsc 0x0000.a4462b7a
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x9f75664
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x09f75664
bdba: 0x0140c70f
76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f7d
avsp=0x1f65
tosp=0x1f65
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1f8f
0x14:pri[1] offs=0x1f86
0x16:pri[2] offs=0x1f7d
block_row_dump:
tab 0, row 0, @0x1f8f
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 2] c1 02
tab 0, row 1, @0x1f86
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 03
col 1: [ 2] c1 03
tab 0, row 2, @0x1f7d
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 04
col 1: [ 2] c1 04
end_of_block_dump
End dump data blocks tsn: 5 file#: 5 minblk 50959 maxblk 50959
注意紅色黑體部分和Interested Transaction Slot (ITS) 部分。
CSC:即Cleanout SCN,最後一次對該資料塊進行Cleanout的SCN。
Itc: Itl count。Itl的數量。看到下面的Itl列表中有兩條記錄,所以是2。
Itl:Interested Transaction List。直譯過來就是感興趣的事物列表。也就是對該資料塊產生影響的事物。對應的數字是序列號。
Xid
:Transaction ID。事務ID號。在相應回滾段的事物資訊表中對應唯一一條記錄。
Uba:Undo Block Address。回滾資料塊地址,該地址對應了該事務在回滾段中記錄的回滾資料的地址。
分解該地址:0x0080051a.059f.34
第一段是回滾資料塊的地址,包括回滾段檔案號和資料塊號;第二段是回滾序列號;第三段是回滾記錄號。
Flag:事務標誌位。這個標誌位就記錄了這個事務的操作,各個標誌的含義分別是:
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 SCN
Scn/Fsc:快速提交(Fast Commit Fsc)的SCN或者Commit SCN。
每條記錄中的行級鎖對應Itl條目lb,對應於Itl列表中的序號,即那個事務在該記錄上產生的鎖。
回滾段
下面再看看回滾段中是如何記錄的:
更新資料(資料更新前b=115):
SQL> conn demo/demo
Connected.
SQL> alter system flush buffer_cache;
System altered.
SQL>
SQL> update t_multiver set b=116 where a=1;
1 row updated.
檢視事務資訊:
select UBAFIL, UBABLK, UBASQN, UBAREC from v$transaction;
11 80 886 16
UBAFIL:回滾段檔案號;
UBABLK:資料塊號;
UBASQN:回滾序列號;
UBAREC:回滾記錄號。
這些資料就對應了資料塊中的Uba。
也可以透過以下方式從資料塊的Uba中獲取到回滾段這些資訊:
0x02c00050.0376.10
0376即回滾序列號,10即回滾記錄號。它們都是16進位制。
下面獲取檔案號和資料塊號:
SQL> set serveroutput on
SQL> declare
2 v_file number;
3 v_block number;
4 begin
5 v_file := dbms_utility.data_block_address_file(to_number('02c00050','xxxxxxxx'));
6 v_block := dbms_utility.data_block_address_block(to_number('02c00050','xxxxxxxx'));
7 dbms_output.put_line('file id: '||v_file);
8 dbms_output.put_line('block id: '||v_block);
9 end;
10 /
file id: 11
block id: 80
PL/SQL procedure successfully completed.
Dump出資料塊和回滾塊:
SQL> alter system dump datafile 5 block 50959;
System altered.
SQL> conn demo/demo
Connected.
SQL>
SQL> alter system dump datafile 11 block 80;
System altered.
資料塊dump資訊:
Block header dump: 0x0140c70f
Object id on Block? Y
seg/obj: 0xe46c csc: 0x00.a4a39eda itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x140c709 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000f.006.00000a14 0x02c00050.0376.10 ---- 1 fsc 0x0000.00000000
0x02 0x0012.02a.0000096d 0x02c00088.0355.09 C--- 0 scn 0x0000.a4a39bd8
回滾塊資訊:
********************************************************************************
UNDO BLK:
xid: 0x000f.006.00000a14 seq: 0x376 cnt: 0x10 irb: 0x10 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset
---------------------------------------------------------------------------
0x01 0x1f68 0x02 0x1ed0 0x03 0x1e50 0x04 0x1d94 0x05 0x1d2c
0x06 0x1cd4 0x07 0x1c7c 0x08 0x1c24 0x09 0x1ba4 0x0a 0x1b24
0x0b 0x1a8c 0x0c 0x1a0c 0x0d 0x1998 0x0e 0x1918 0x0f 0x187c
0x10 0x17e8
... ...
*-----------------------------
* Rec #0x10 slt: 0x06 objn: 58476(0x0000e46c) objd: 58476 tblspc: 5(0x00000005)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
uba: 0x02c00050.0376.0f ctl max scn: 0x0000.a4a39a02 prv tx scn: 0x0000.a4a39a16
txn start scn: scn: 0x0000.a4a39eda logon user: 35
prev brb: 46137423 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x04 ver: 0x01
op: L itl: xid: 0x0014.022.00000776 uba: 0x02c000a5.029b.32
flg: C--- lkc: 0 scn: 0x0000.a4a39a3e
KDO Op code: URP row dependencies Disabled
xtype: XAxtype KDO_KDOM2 flags: 0x00000080 bdba: 0x0140c70f hdba: 0x0140c70b
itli: 1 ispac: 0 maxfr: 4858
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 8
ncol: 2 nnew: 1 size: 0
Vector content:
col 1: [ 3] c2 02 10
End dump data blocks tsn: 11 file#: 11 minblk 80 maxblk 80
仔細比較一下兩個dump檔案,資料塊的事務回滾資訊就很清楚了:
在資料塊中:
物件號是0xe46c
,即十進位制的58476;
Xid是0x000f.006.00000a14
;
Uba是0x02c00050.0376.10
。即11號檔案的第80個資料塊,回滾序列號是0x0376,回滾記錄號是0x10。
回滾資料塊中:
Xid是0x000f.006.00000a14
,與資料塊中Itl中的Xid對應;
seq: 0x376
,與資料塊的Uba中吻合;
cnt: 0x10
,此回滾資料塊中有16條回滾記錄,根據Uba,我們要找的是第16條記錄;
找到第16條回滾記錄Rec #0x10
:
slt: 0x06
,即第6個slot。
objn
和objd
是58476
,與資料塊中的物件號相同;
tblspc
是5
,也就是物件t_multiver所在的表空間號;
Layer
即層次,這是一次對記錄的更新,所以是11 (Row)
;
Undo type: Regular undo Begin trans
,我們這個事務是剛開始時,在沒有提交或回滾時dump出來的;
Temp Object: No
,這個物件不是臨時物件。
在*-----------------------------以下的就是記錄的舊資料映象了:記錄了它的Uba、最大控制Scn(ctl max scn
)、上一次事務scn(prv tx scn
)等資訊,如果我們做了事務開始前的資料dump,就能一一找到對應關係了。最下面就是修改前的資料記錄了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11423276/viewspace-988359/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於事務對資料塊的操作過程的分析和試驗(2)(轉)
- 關於流資料上的事務操作
- 關於事務的儲存過程儲存過程
- 關於資料庫事務和鎖的一些分析資料庫
- 關於資料庫事務併發的理解和處理資料庫
- 關於表的資料塊驗證 DUMP 工具 使用
- 資料分析對於準備應對財務困境的企業至關重要
- 關於 資料壞塊 的整理和總結
- 關於隱式資料型別轉換的一些試驗資料型別
- 對於關卡類遊戲的資料分析方式遊戲
- 推薦關於區塊鏈的1個課程和3篇文章區塊鏈
- 關於Entity Freamwork 儲存過程操作儲存過程
- ORACLE包和過程依賴關係測試(轉)Oracle
- 測試過程中的評審工作及關注事項
- 關於海量資料處理分析的經驗總結
- Jive筆記1--關於Jive1中的驗證和相關類的呼叫 (轉)筆記
- 關於 VC 編譯的猜想與試驗 (轉)編譯
- 大資料分析過程是如何的大資料
- oracle資料庫的關閉過程Oracle資料庫
- 資料塊內事務槽不足導致資料塊鎖
- 關於資料庫事務和鎖的必會知識點,你掌握了多少?資料庫
- 關於儲存過程中不能操作其他使用者表資料的問題解決儲存過程
- MySQL 事務提交過程MySql
- 資料需求分析過程
- bbs的資料結構和儲存過程(二) (轉)資料結構儲存過程
- bbs的資料結構和儲存過程(一) (轉)資料結構儲存過程
- bbs的資料結構和儲存過程(三) (轉)資料結構儲存過程
- 儲存過程、觸發器與事務之間的關係儲存過程觸發器
- 關於 MySQL 的巢狀事務MySql巢狀
- 關於分散式事務的理解分散式
- 【計算機網路】透過ensp實驗分析二三層資料包轉發過程計算機網路
- MySQL innodb引擎的事務執行過程MySql
- 關於大資料的那些事兒(一)大資料
- 有關於SQL Server資料庫死鎖的分析(轉)SQLServer資料庫
- 資料庫事務隔離級別分析----轉載資料庫
- 專案管理過程中的問題分析方法1(轉)專案管理
- Django ORM 和 sqlalchemy 在每次發起資料庫請求前對殘留事務的清理操作DjangoORMSQL資料庫
- Express 原始碼分析1-(服務啟動和請求服務過程)Express原始碼