oracle資料塊格式小結
Oracle資料塊可分為三層
更細化
Cache layer--20位元組,包含DBA、塊型別、塊格式、SCN;資料塊被讀取時進行完整性檢查,確保沒有損壞或fracture,即塊更新資訊只有部分被寫入磁碟;
Transaction layer
固定事務layer--塊型別,最後一次塊清除時間csc,ITL數量itc;
可變事務layer--包含ITL,每個24位元組;
Data layer
Data header(KDBH):14位元組,表目錄項個數,行目錄項個數,指向free space的開始和結束位置的偏移量,當前塊剩餘空間
表目錄--cluster表記錄多於1,記錄行目錄中與此表相關的個數,以及起始位置
行目錄--記錄每行的起始位置,即指向行頭的偏移量,每個2位元組;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的輸出格式與實際順序可能不一致
****************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位元組base + 4位元組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:資料塊格式,從8i到10205一直為0x02
Chkval:可選項,db_block_checksum=true時啟用
Tail:存於塊尾footer,SCN base低位2位元組 + 塊型別 + SCN seq = 12ca + 06 + 01
Kcbh資料結構
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 */
}
--變長部分,每個ITL槽24個位元組
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:事務ID undoseg + slot + wrap
Uba:undodba + seqno + recordNo
Flags:C=Commited; U=Commited Upper Bound; T=Active at CSC
Lck: 此事務涉及的行數目
Scn:提交TX時的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 –空閒空間的結束偏移量
avsp=0x1f65 –空閒空間總量
tosp=0x1f65
資料塊頭結構
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]
每行對應一條記錄,每個2位元組,kdbr為sb2型別陣列,指向每一行的頭;
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
行由行頭和資料兩部分,
行頭--行標誌 + 鎖標誌 + 列數,一般佔3位元組;T1-行大小; cc-本行的列數; lb-鎖標誌位,指向ITL; fb-標誌位;
資料—列長度 + 列資料
1 如何定位每1行?
由行目錄kdbr儲存每行的偏移量,每項2位元組;
BBED> p kdbr
sb2 kdbr[0] @118 8078
sb2 kdbr[1] @120 8068
BBED> p *kdbr[0]
rowdata[10] ----------- ub1 rowdata[10]
@8178 0x2c
由於塊頭包含可變長的ITL和行目錄,故空閒空間從塊尾開始分配;
2 row flag的取值範圍
刪除資料時僅將行標記為deleted,行頭row flag的位掩碼如下
對於普通行(沒有行連結/行遷移/被刪除/簇表),其基本標誌位為HFL,即32+8+4=44=0x2c;
若行被刪除,則row flag=44+16=60=0x3c;
恢復尚未被覆蓋的刪除行,只需將其row flag從3c改為2c,row flag位於行頭首位元組;
詳細可參照http://orafaq.com/papers/dissassembling_the_data_block.pdf
3 行鎖原理?
Oracle沒有為行鎖提供資料結構,而是通過 事務表 + ITL + lb(row header)實現;
一個事務分配一個TX lock和若干TM lock,涉及的資料塊各需1個ITL,通過其XID關聯事務表slot,而資料行則通過lb指向本塊的ITL;
4 資料塊驗證?
資料塊讀入記憶體或寫入磁碟時,會做一致性檢查:
1 塊版本,塊頭的SCNBase/塊型別/seq同footer比較;
2 cache層的DBA同block buffer的DBA比較;
3 block-checksum, 如果開啟checksum則做驗證;
Dbv只檢查資料塊的header/footer,做邏輯驗證;
Db_block_checking:替代10210/10211/10212事件,進行塊完整性檢查,如free slot list/行位置/鎖數量;檢查時會複製塊,如有錯誤將塊標誌為soft corruption;
Db_block_checksum:dbwr和direct loader寫資料塊時計算checksum並存於cache層chkval,再次讀取時重新計算並與已有checksum比較;
Dbms_repair修復cache/transaction層的錯誤,將塊標示為soft corruption;
event
10231全表掃描時跳過壞塊
10233跳過索引壞塊
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-1086433/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料塊格式Oracle
- ORACLE 資料塊格式深入解析Oracle
- Oracle資料庫日期格式轉換操作Oracle資料庫
- oracle資料庫--Oracle雙引號和單引號的區別小結Oracle資料庫
- 分塊小結
- Oracle資料庫壞塊典型案例分析Oracle資料庫
- oracle asm 資料塊重構恢復OracleASM
- 區塊鏈資料總結區塊鏈
- Oracle資料庫壞塊典型案例擴充Oracle資料庫
- oracle的interval時間格式的總結Oracle
- oracle 普通表空間資料檔案壞塊Oracle
- 例項演示oracle資料塊狀態檢視v$bh的用法一 獲取oracle物件所佔用的資料塊Oracle物件
- 一次ORACLE資料庫undo壞塊處理Oracle資料庫
- Agile PLM資料庫表結構(Oracle)資料庫Oracle
- python環境連結Oracle資料庫PythonOracle資料庫
- 大資料相關資料論文小結大資料
- Oracle 21C區塊連結串列Oracle
- ORACLE編譯失效物件小結Oracle編譯物件
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- 資料結構之Stack | 讓我們一塊來學習資料結構資料結構
- 資料結構之Queue | 讓我們一塊來學習資料結構資料結構
- 資料結構之Set | 讓我們一塊來學習資料結構資料結構
- 資料結構之LinkedList | 讓我們一塊來學習資料結構資料結構
- 【許曉笛】EOS 區塊資料結構資料結構
- 草稿 核取方塊繫結資料 1204
- C基本資料型別小結資料型別
- 資料庫期末複習小結資料庫
- Oracle資料庫中資料行遷移與行連結Oracle資料庫
- .net中使用oracle資料庫分頁小技巧Oracle資料庫
- 資料包格式
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- 原創 oracle 資料完整性總結Oracle
- Oracle如何診斷遠端訪問資料庫慢/超時等問題小結Oracle資料庫
- oracle使用儲存過程將表資料以excel格式匯出Oracle儲存過程Excel
- oracle DG 日誌傳輸小結Oracle
- 【資料庫資料恢復】Oracle資料庫檔案出現壞塊報錯的資料恢復案例資料庫資料恢復Oracle
- 微信小程式資料資料繫結顯示NaN微信小程式NaN
- MT和MPT—區塊鏈的資料結構區塊鏈資料結構
- hrsc2016資料集xml格式轉換為yolo格式,附下載連結XMLYOLO