怎么進(jìn)行oracle數(shù)據(jù)塊格式的分析

本篇文章給大家分享的是有關(guān)怎么進(jìn)行oracle數(shù)據(jù)塊格式的分析,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

成都創(chuàng)新互聯(lián)主要為客戶(hù)提供服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)視覺(jué)設(shè)計(jì)、VI標(biāo)志設(shè)計(jì)、成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)、網(wǎng)站程序開(kāi)發(fā)、HTML5響應(yīng)式網(wǎng)站建設(shè)公司、手機(jī)網(wǎng)站制作設(shè)計(jì)、微商城、網(wǎng)站托管及成都網(wǎng)站維護(hù)、WEB系統(tǒng)開(kāi)發(fā)、域名注冊(cè)、國(guó)內(nèi)外服務(wù)器租用、視頻、平面設(shè)計(jì)、SEO優(yōu)化排名。設(shè)計(jì)、前端、后端三個(gè)建站步驟的完善服務(wù)體系。一人跟蹤測(cè)試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為建筑動(dòng)畫(huà)行業(yè)客戶(hù)提供了網(wǎng)站設(shè)計(jì)服務(wù)。


  Oracle數(shù)據(jù)塊可分為三層
怎么進(jìn)行oracle數(shù)據(jù)塊格式的分析 

更細(xì)化

怎么進(jìn)行oracle數(shù)據(jù)塊格式的分析 

Cache layer--20字節(jié),包含DBA、塊類(lèi)型、塊格式、SCN;數(shù)據(jù)塊被讀取時(shí)進(jìn)行完整性檢查,確保沒(méi)有損壞或fracture,即塊更新信息只有部分被寫(xiě)入磁盤(pán);
Transaction layer
固定事務(wù)layer--塊類(lèi)型,最后一次塊清除時(shí)間csc,ITL數(shù)量itc;
可變事務(wù)layer--包含ITL,每個(gè)24字節(jié);
Data layer
Data header(KDBH):14字節(jié),表目錄項(xiàng)個(gè)數(shù),行目錄項(xiàng)個(gè)數(shù),指向free space的開(kāi)始和結(jié)束位置的偏移量,當(dāng)前塊剩余空間
表目錄--cluster表記錄多于1,記錄行目錄中與此表相關(guān)的個(gè)數(shù),以及起始位置
行目錄--記錄每行的起始位置,即指向行頭的偏移量,每個(gè)2字節(jié);innodb采用的是entry?


以10205為例
create table t(id number(2));
insert into t values(1);
insert into t values(2);
commit;
SQL> select FILE_ID,BLOCK_ID,EXTENT_ID,BLOCKS from dba_extents where owner='SYS' and SEGMENT_NAME='T';

   FILE_ID   BLOCK_ID  EXTENT_ID     BLOCKS
---------- ---------- ---------- ----------
        68    2260129          0          8

SQL> select dbms_rowid.rowid_block_number(rowid),id from t;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)         ID
------------------------------------ ----------
                             2260132          1
                             2260132          2
                             2260132          1

alter system dump datafile 68 block 2260132;
select spid from v$process where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));


Dump block的輸出格式與實(shí)際順序可能不一致
****************cache layer******************************
buffer tsn: 115 rdba: 0x11227ca4 (68/2260132)
scn: 0x0860.07f11dad seq: 0x01 flg: 0x02 tail: 0x1dad0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data


SCN=2字節(jié)base + 4字節(jié)wrap
Seq:sequence number
Flag:0x01—new block;0x02—delayed logging change advance SCN/seq;0x04—check value saved-block xor’s to zero;0x08—temporary block;
Frmt:數(shù)據(jù)塊格式,從8i到10205一直為0x02
Chkval:可選項(xiàng),db_block_checksum=true時(shí)啟用
Tail:存于塊尾footer,SCN base低位2字節(jié) + 塊類(lèi)型 + SCN seq = 12ca + 06 + 01


Kcbh數(shù)據(jù)結(jié)構(gòu)
typedef struct kcbh_ {
ub1 type_kcbh;
ub1 frmt_kcbh;
ub1 spare1_kcbh;
ub1 spare2_kcbh;
krdba rdba_kcbh;
ub4 bas_kcbh; /* base of SCN */
ub2 wrp_kcbh; /* wrap of SCN */
ub1 seq_kcbh; /* seq# of changes at same scn, KCBH_NLCSEQ */
ub1 flg_kcbh; /* see KCBHFNEW etc below */
ub2 chkval_kcbh;
ub2 spare3_kcbh;
} kcbh;



****************transaction layer************************
--固定部分
Block header dump:  0x11227ca4
 Object id on Block? Y
 seg/obj: 0x5454c  csc: 0x860.7f11dac  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x11227ca1 ver: 0x01 opc: 0
     inc: 0  exflg: 0

Csc:最后一次塊清除SCN
Typ:1=DATA; 2=INDEX


typedef struct ktbbh_ { /* 10201 struct ktbbh block header */
ub1 ktbbhtyp; /* block type */
ub4 ktbbhsid;
kscn ktbbhcsc; /* effective time of last cleanout */
b2 ktbbhict; /* number of itl entries mask 0x00ff*/
ub1 ktbbhflg; /* flags */
ub1 ktbbhfsl; /* free space lock */
krdba ktbbhfnx; /* next block in free list */
}


--變長(zhǎng)部分,每個(gè)ITL槽24個(gè)字節(jié)
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000a.01d.00017bc3  0x00800330.7d5f.1e  --U-    3  fsc 0x0000.07f11dad
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000


Xid:事務(wù)ID undoseg + slot + wrap
Uba:undodba + seqno + recordNo
Flags:C=Commited; U=Commited Upper Bound; T=Active at CSC
Lck: 此事務(wù)涉及的行數(shù)目
Scn:提交TX時(shí)的SCN


struct ktbit {
kxid ktbitxid; /* transaction id */
kuba ktbituba; /* undo address for last change */
b2 ktbitflg;   /* num of locks in block */
ktbitun_t _ktbitun;
ub4 ktbitbas;  /* sys commit num base */
}



****************data layer******************************
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x0d0e8664
bdba: 0x11227ca4
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18  --空閑空間的起始偏移量
fseo=0x1f86 –空閑空間的結(jié)束偏移量
avsp=0x1f65 –空閑空間總量
tosp=0x1f65

數(shù)據(jù)塊頭結(jié)構(gòu)
struct kdbh {
ub1 kdbhflag;  /* FLAGs */
ktno kdbhntab; /* Number of TABles in the table index */
ub2 kdbhnrow;  /* Number of ROWs in the row index */
sb2 kdbhfrre;  /* first FRee Row index Entry */
sb2 kdbhfsbo;  /* Free Space Beginning Offset */
sb2 kdbhfseo;  /* Free Space Ending Offset */
b2 kdbhavsp;   /* AVailable SPace in the block */
b2 kdbhtosp;   /* TOtal Space that will be available */
}


0xe:pti[0]      nrow=3  offs=0
表目錄:
struct kdbt {
b2 kdbtoffs; /* OFFSet in the block from kdbpri */
b2 kdbtnrow; /* Number of Rows in the table */
}


0x12:pri[0]     offs=0x1f92
0x14:pri[1]     offs=0x1f8c
0x16:pri[2]     offs=0x1f86
行目錄:sb2 kdbr[3]
每行對(duì)應(yīng)一條記錄,每個(gè)2字節(jié),kdbr為sb2類(lèi)型數(shù)組,指向每一行的頭;


block_row_dump:
tab 0, row 0, @0x1f92
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f8c
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 03
tab 0, row 2, @0x1f86
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
行由行頭和數(shù)據(jù)兩部分,
行頭--行標(biāo)志 + 鎖標(biāo)志 + 列數(shù),一般占3字節(jié);T1-行大??; cc-本行的列數(shù); lb-鎖標(biāo)志位,指向ITL; fb-標(biāo)志位;
數(shù)據(jù)—列長(zhǎng)度 + 列數(shù)據(jù)


怎么進(jìn)行oracle數(shù)據(jù)塊格式的分析

1 如何定位每1行?
由行目錄kdbr存儲(chǔ)每行的偏移量,每項(xiàng)2字節(jié);
BBED> p kdbr
sb2 kdbr[0]                                 @118      8078 
sb2 kdbr[1]                                 @120      8068   
BBED> p *kdbr[0]
 rowdata[10] ----------- ub1 rowdata[10]                            
@8178     0x2c
由于塊頭包含可變長(zhǎng)的ITL和行目錄,故空閑空間從塊尾開(kāi)始分配;
 

2 row flag的取值范圍
刪除數(shù)據(jù)時(shí)僅將行標(biāo)記為deleted,行頭row flag的位掩碼如下

怎么進(jìn)行oracle數(shù)據(jù)塊格式的分析

對(duì)于普通行(沒(méi)有行鏈接/行遷移/被刪除/簇表),其基本標(biāo)志位為HFL,即32+8+4=44=0x2c;
若行被刪除,則row flag=44+16=60=0x3c;
恢復(fù)尚未被覆蓋的刪除行,只需將其row flag從3c改為2c,row flag位于行頭首字節(jié);
詳細(xì)可參照http://orafaq.com/papers/dissassembling_the_data_block.pdf

3 行鎖原理?
Oracle沒(méi)有為行鎖提供數(shù)據(jù)結(jié)構(gòu),而是通過(guò) 事務(wù)表 + ITL + lb(row header)實(shí)現(xiàn);
一個(gè)事務(wù)分配一個(gè)TX lock和若干TM lock,涉及的數(shù)據(jù)塊各需1個(gè)ITL,通過(guò)其XID關(guān)聯(lián)事務(wù)表slot,而數(shù)據(jù)行則通過(guò)lb指向本塊的ITL;


4 數(shù)據(jù)塊驗(yàn)證?
數(shù)據(jù)塊讀入內(nèi)存或?qū)懭氪疟P(pán)時(shí),會(huì)做一致性檢查:
1 塊版本,塊頭的SCNBase/塊類(lèi)型/seq同footer比較;
2 cache層的DBA同block buffer的DBA比較;
3 block-checksum, 如果開(kāi)啟checksum則做驗(yàn)證;


Dbv只檢查數(shù)據(jù)塊的header/footer,做邏輯驗(yàn)證;
Db_block_checking:替代10210/10211/10212事件,進(jìn)行塊完整性檢查,如free slot list/行位置/鎖數(shù)量;檢查時(shí)會(huì)復(fù)制塊,如有錯(cuò)誤將塊標(biāo)志為soft corruption;
Db_block_checksum:dbwr和direct loader寫(xiě)數(shù)據(jù)塊時(shí)計(jì)算checksum并存于cache層chkval,再次讀取時(shí)重新計(jì)算并與已有checksum比較;
Dbms_repair修復(fù)cache/transaction層的錯(cuò)誤,將塊標(biāo)示為soft corruption;


event
10231全表掃描時(shí)跳過(guò)壞塊
10233跳過(guò)索引壞塊

以上就是怎么進(jìn)行oracle數(shù)據(jù)塊格式的分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱(chēng):怎么進(jìn)行oracle數(shù)據(jù)塊格式的分析
本文來(lái)源:http://muchs.cn/article36/ijcdpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、ChatGPT移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)微信小程序、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)