Oracle數據塊原理的深入剖析_第1頁
Oracle數據塊原理的深入剖析_第2頁
Oracle數據塊原理的深入剖析_第3頁
Oracle數據塊原理的深入剖析_第4頁
Oracle數據塊原理的深入剖析_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Oracle數據塊原理深入剖析-入門基礎時間:2009-03-10 00:00來源:IT168 bitsCN編輯字體:大 中 小數據塊(Oracle Data Blocks),本文簡稱為“塊”,是Oracle最小的存儲單位,Oracle數據存放在“塊”中。一個塊占用一定的磁盤空間。特別注意的是,這里的“塊”是Oracle的“數據塊”,不是操作系統的“塊”。 Oracle每次請求數據的時候,都是以塊為單位。也就是說,Oracle每次請求的數據是塊的整數倍。如果Oracle請求的數據量不到一塊,Oracle也會讀取整個塊。所以說,“塊”是Oracle讀寫數據的最小單位或者最基本的單位。塊的標準大大

2、小由初始化化參數DB_BLOCKK_SIZEE指定。具有有標準大小的的塊稱為標準準塊(Staandardd Blocck)。塊的的大小和標準準塊的大小不不同的塊叫非非標準塊(NNonstaandardd Blocck)。同一一數據庫中,OOraclee9i及以上上版本支持同同一數據庫中中同時使用標標準塊和非標標準塊。Orracle允允許指定5種種非標準塊(Nonsttandarrd Bloock)。操作系統每每次執行I/O的時候,是是以操作系統統的塊為單位位;Oraccle每次執執行I/O的的時候,都是是以Oraccle的塊為為單位。Oraclle數據塊大大小一般是操操作系統塊的的整數倍。數據

3、塊的格格式(Datta Bloock Foormat)塊中存放表表的數據和索索引的數據,無無論存放哪種種類型的數據據,塊的格式式都是相同的的,塊由塊頭頭(headder/Coommon and VVariabble),表表目錄(Taable DDirecttory),行目錄(RRow Diirectoory),空空余空間(FFree SSpace)和行數據(Row DData)五五部分組成,如下圖所示示。 塊頭(heeader/Commoon andd Variiable):存放塊的的基本信息,如如:塊的物理理地址,塊所所屬的段的類類型(是數據據段還是索引引段)。 表表目錄(Taable DD

4、irecttory):存放表的信信息,即:如如果一些表的的數據被存放放在這個塊中中,那么,這這些表的相關關信息將被存存放在“表目錄”中。行目錄(RRow Diirectoory):如如果塊中有行行數據存在,則則,這些行的的信息將被記記錄在行目錄錄中。這些信信息包括行的的地址等。行數據(RRow Daata):是是真正存放表表數據和索引引數據的地方方。這部分空空間是已被數數據行占用的的空間。空余空間(Free Spacee):空余空空間是一個塊塊中未使用的的區域,這片片區域用于新新行的插入和和已經存在的的行的更新。頭部信息區區(Overrhead):我們把塊塊頭(heaader/CCommonn

5、 and Variaable),表目錄(TTable Direcctory),行目錄(Row DDirecttory)這這三部分合稱稱為頭部信息息區(Oveerheadd)。頭部信信息區不存放放數據,它存存放的整個塊塊的信息。頭頭部信息區的的大小是可變變的。一般來來說,頭部信信息區的大小小介于84字字節(byttes)到1107字節(bytess)之間。數據塊中自自由空間的使使用當往數據庫庫中插入(IINSERTT)數據的時時候,塊中的的自由空間會會減少;當對對塊中已經存存在的行進行行修改(UPPDATE)的時候(使使記錄長度增增加),塊中中的自由空間間也會減少。DELETTE語句和UUPDA

6、TEE語句會使塊塊中的自由空空間增加。當當使用DELLETE語句句刪除塊中的的記錄或者使使用UPDAATE語句把把列的值更改改成一個更小小值的時候,OOraclee會釋放出一一部分自由空空間。釋放出出的自由空間間并不一定是是連續的。通通常情況下,OOraclee不會對塊中中不連續的自自由空間進行行合并。因為為合并數據塊塊中不連續的的自由空間會會影響數據庫庫的性能。只只有當用戶進進行數據插入入(INSEERT)或者者更新(UPPDATE)操作,卻找找不到連續的的自由空間的的時候,Orracle才才會合并數據據塊中不連續續的自由空間間。對于塊中的的自由空間,OOraclee提供兩種管管理方式:自自

7、動管理,手手動管理行鏈接和行行遷移(Roow Chaainingg and Migraating)行鏈接(RRow Chhaininng):如果果我們往數據據庫中插入(INSERRT)一行數數據,這行數數據很大,以以至于一個數數據塊存不下下一整行,OOraclee就會把一行行數據分作幾幾段存在幾個個數據塊中,這這個過程叫行行鏈接(Roow Chaainingg)。如下圖圖所示: 如果一行數數據是普通行行,這行數據據能夠存放在在一個數據塊塊中;如果一一行數據是鏈鏈接行,這行行數據存放在在多個數據塊塊中。行遷移(RRow Miigratiing):數數據塊中存在在一條記錄,用用戶執行UPPDATE

8、更更新這條記錄錄,這個UPPDATE操操作使這條記記錄變長,這這時候,Orracle在在這個數據塊塊中進行查找找,但是找不不到能夠容納納下這條記錄錄的空間,無無奈之下,OOraclee只能把整行行數據移到一一個新的數據據塊。原來的的數據塊中保保留一個“指針”,這個“指針”指向新的數數據塊。被移移動的這條記記錄的ROWWID保持不不變。行遷移移的原理如下下圖所示: 無論是行鏈鏈接還是行遷遷移,都會影影響數據庫的的性能。Orracle在在讀取這樣的的記錄的時候候,Oraccle會掃描描多個數據塊塊,執行更多多的I/O。塊中自由空空間的自動管管理Oraclle使用位圖圖(bitmmap)來管管理和跟

9、蹤數數據塊,這種種塊的空間管管理方式叫“自動管理”。自動管理理有下面的好好處:易于使用用更好地利利用空間可以對空空間進行實時時調整塊中自由空空間的手動管管理用戶可以通通過PCTFFREE, PCTUSSED來調整整塊中空間的的使用,這種種管理方式叫叫手動管理。相相對于自動管管理,手動管管理方式比較較麻煩,不容容易掌握,容容易造成塊中中空間的浪費費。PCTFRREE參數用用于指定塊中中必須保留的的最小空閑空空間百分例。之之所以要預留留這樣的空間間,是因為UUPDATEE時,需要這這些空間。如如果UPDAATE時,沒沒有空余空間間,Oraccle就會分分配一個新的的塊,這會產產生行遷移(Row M

10、Migratting)。PCTUSSED也是用用于設置一個個百分比,當當塊中已使用用的空間的比比例小于這個個百分比的時時候,這個塊塊才被標識為為有效狀態。只只有有效的塊塊才被允許插插入數據。文章轉載自網管管網: HYPERLINK ORACLE塊塊的分析(一一)一直以來來對“塊”的概念總是是含混不清,從從字面意義理理解,只知道道這是ORAACLE存放放數據的最小小單位,然而而它的內部世世界如何呢,本本人打算從今今天開始連載載幾篇文檔,對對它進行深度度分析。 通過很多文文檔、資料,了了解到了數據據庫基本結構構魚刺圖: 基本上每個個對象對應一一個段( Segmeent),只只有分區對應應多個段,這

11、這里的對象包包括tablle,inddex,paartitiion等等,段段可以跨越多多個數據文件件。 每個段又有有多個區(eextentt)來組成,這這些區不能跨跨越多個數據據文件,同時時在系統使用用過程中自動動擴展。 最后是塊(bblock),所所有的數據都都是存放在塊塊中。為了適適應操作系統統,每個塊在在創建數據庫庫的時候默認認了一個大小小,這個大小小一般是8KK,同時在99I及其以 后的版本中中增加了不同同大小的塊參參數,這將在在以后的實驗驗中體現。先先說說這個88K大小的塊塊,一般來說說,為了使得得oraclle運行讀寫寫數據文件的的時候有一個個合理 的吞吐量,這這里的塊大小小,都跟

12、操作作系統塊大小小設為整數倍倍,例如nttfs格式化化的磁盤文件件,每個物理理塊大小為44,這里orracle的的塊大小為88,即是代表表每 讀取一個ooraclee塊,其實物物理上也就是是讀取了兩個個操作系統塊塊。 這里主要指指的是數據文文件存放在塊塊設備上,在在實際的生產產環境中,大大部分情況都都是將數據庫庫安裝在裸設設備(RAWW)也叫做原原始分區之上上。關于RAAW將在以后后進行 講解解。 通過上面面這段文字,我我們可以了解解到ORACCLE基本的的存儲結構,下下一篇將針對對塊的大小與與存放數據大大小來做實驗驗。 (二)上一節節了解到了OORACLEE的存儲結構構,這節講一一講塊的大小

13、小與數據存放放之間的關系系。 大家都知道道了在ORAACLE環境境中,所有的的對象都是存存放在塊中,這這個塊大小與與存放的記錄錄之間到底存存在怎樣的關關系呢? 做一個實驗驗看看: 創建一個表表空間tesst creatte tabblespaace teest daatafille /ooraclee/oraddata/ttest.ddbf ssize 1100m; 創建一個用用戶 creatte useer tesst ideentifiied byy testt defaault ttablesspace test; 創建一個個表 creatte tabble teest.t11 (a1

14、numbeer,a2 varchhar2(1100); 檢查段,可可以發現在這這個視圖中出出現了名稱為為T的段,段段類型為TAABLE,這這個段里面分分配了1個區區,其中包含含8個塊,大大小為64KK字節。 selecct seggment_name,blockks,exttents,bytess,segmment_ttype,ttablesspace_name from dba_ssegmennts whhere oowner=TESTT; SEEGMENTT_NAMEE BLOCKKS EXTENNTS BYYTES SSEGMENNT_TYPPE TAABLESPPACE_NNAME -

15、 - - - - -T 8 1 655366 TABLLE TEST 檢查區,可可以發現在這這個視圖中出出現了一個區區,區號為00,包含8個個塊,大小為為64K字節節。 selecct seggment_name,segmeent_tyype,exxtent_id,bllocks,bytess fromm dba_extennts whhere oowner=TESTT; SEEGMENTT_NAMEE SEGMMENT_TTYPE EXTEENT_IDD BLOCKKS BYTTES- - - - -TT TABLEE 0 88 655336 檢檢查塊,可以以發現這里沒沒有載入到內內存的塊,

16、由由此斷定,在在數據未寫入入的時候,內內存中并沒有有存放數據的的塊。 selecct frrom v$bh whhere tts#=122; 未選定定行 插入10行行數據,進行行測試。 SQL declaare22i nnumberr3;4begiin5for i in 1.100 loopp6execuute immmediaate iinsertt intoo testt.t vaalues (:x,:y) uusing i,i;7eend looop;8ennd;99/ PPL/SQLL 過程已成成功完成。 再次查看vv$bh視圖圖,檢查內存存中是否使用用到了塊。 selecct frr

17、om v$bh whhere tts#=122; FILLE# BLOOCK# CLLASS# STATUU XNNC OBBJD- - - - - - 1 288089 4 xcur 0 110038 1 288090 1 xcur 0 110038 哈哈哈,果然出現現了數據,說說明在數據插插入的表的時時候在內存中中已經載入了了分配的塊,同同時在這些塊塊中寫入了數數據,這里占占用了兩個塊塊,塊號分別別為280889,280090,其中中我們可以根根據CLASSS#來判斷斷出他們屬于于不同類型。 (三)這一節緊接著上一節來說。上一節通過實驗,我們了解到,塊的創建和讀取流程,不過只是針對一個會話

18、的,現在我們來看看在一個會話中插入數據之后,同時在另外一個會話查詢數據,這樣的情況會對塊有什么影響。打開一個新的會話, 然后執行如下命令:查詢表,由于插入數據的事務沒有提交,這里在另外的會話中就看不到任何數據,深深體現了ORACLE的多版本一致性select * from test_gao.t; 未選定行 查詢視圖v$bh,看是否有了變化select from v$bh where ts#=12; FILE# BLOCK# CLASS# STATU XNC OBJD- - - - - - 1 28089 4 xcur 0 11038 1 28090 1 cr 0 11038 1 28090 1

19、 cr 0 11038 1 28090 1 xcur 0 11038 果然和上一節查詢出來的結果不同,多了紅色字體標識出來的兩行,大家可以看到這兩行的STATUS字段值為cr,什么是cr呢?它是Consistency Read(一致性讀取)的縮寫。從這里可以看出28090這個塊被兩個會話進行了操作。 在第一個會話中回滾事務會發生什么呢?看下面的操作:會話1:執行rollback SQL rollback;回退已完成。 再次查詢v$bh視圖,看看什么情況select from v$bh where objd=11038; FILE# BLOCK# CLASS# STATU XNC OBJD- -

20、 - - - - 1 28089 4 xcur 0 11038 1 28090 1 cr 0 11038 1 28090 1 cr 0 11038 1 28090 1 xcur 0 11038 結果還是一樣,說明在事務回滾之后,塊還是處于一致讀取的狀態。(四)我們繼續上一節的話題。 關閉數據庫實例 SQL shutdown immediate 數據庫已經關閉。已經卸載數據庫。 重新打開數據庫 SQLstartup ORACLE 例程已經啟動。Total System Global Area253214492 bytesFixed Size 454428 bytesVariable Size 1

21、17440512 bytesDatabase Buffers 134217728 bytesRedo Buffers 1101824 bytes數據庫裝載完畢。數據庫已經打開。 檢查v$bh視圖 select from v$bh where objd=11038; 未選定行 說明在沒有進行塊中數據的相關操作的時候,并沒有從物理文件中提取塊到內存。 執行查詢或者插入、更新的SQL語句 SQL insert into test.t values (200,200); 已創建 1 行。 再次檢查v$bh視圖 SQL select from v$bh where objd=11038; FILE# B

22、LOCK# CLASS# STATU XNC OBJD- - - - - - 1 28089 4 xcur 0 11038 1 28090 1 xcur 0 11038 總結:在沒有進行物理I/O的時候,v$bh視圖中不會出現相關的塊信息,同時證明此視圖中存放的乃是數據文件塊放到內存中的“塊”信息。 HYPERLINK t _blank 實例講解Oraacle 99i數據壞塊塊的處理2009-3-17 作者: 編編輯:齊瑞瑞瑞 HYPERLINK t _blank 點擊進入論論壇關鍵詞: HYPERLINK t _blank Oraacle HYPERLINK t _blank 數據 HYPE

23、RLINK t _blank 處理筆者在一臺生產產用測試庫上上SELECCT一個表時時出現ORAA-015778,一個塊塊損壞,以前前學習過塊損損壞怎么處理理,到還真沒沒遇到過,今今天總算讓我我遇到了,還還是一臺生產產用測試庫,就就不用很緊張張了。數據庫版本是99.2.0.4,Oraacle9ii的RMANN有一個bllockreecoverr命令,可以以在線修復壞壞塊,以下就就是使用RMMAN修復壞壞塊的過程。SQL coonn owwi/owiiConneected.SQL selecct * ffrom ddpa_hiistoryy;seleect * from dpa_hhistorr

24、y*ERRORR at lline 11:ORA-015788: ORAACLE ddata bblock corruupted (filee # 155, bloock # 18)ORRA-011110: ddata : /d001/appp/oraccle/orradataa/dpa/dpa011.dbf報ORA-011578數據據塊損壞,以以下使用RMMAN命令查查詢是否可以以使用bloockreccover命命令恢復以及及怎樣恢復使用rman登登錄cataalog數據據庫ora9rrmanseerver $ rrman ttargett sys/oraclledpaa cataalog

25、 rrman/rrmanRecoverry Mannager: Releease 99.2.0.8.0 - ProdductioonCopyrigght (cc) 19995, 20002, OOraclee Corpporatiion. All rrightss reseerved.connectted too targget daatabasse: DPPA (DBBID=84434950022)coonnectted too recoovery catallog daatabasse查找最近datta的全備份份,今天下午午剛做了一次次RMAN的的全備份RMAN llist bbackup

26、p of ddata;List off Backkup Seets=BS Key Typee LV SSize Devicce Typpe Elaapsed Time Complletionn Timee- - - - - - -6433 Full 644K DDISK 00:000:27 116-MARR-09 BBP Keyy: 6500 Sttatus: AVAIILABLEE Taag: TAAG200990316TT1543552Piecce Namme: /dd02/fuullbacckup/2200903316_daata_244_1Lisst of Dataffiles in

27、baackup set 6643 Tyype Ckkp SCNN CCkp Tiime NName- - - - - -15 FFull 11185622509055 16-MMAR-099 /d011/app/oraclle/oraadata/dpa/ddpa01.dbf查找SCN 11185622509055 以后的aarchivvelog是是否有備份RMAN llist bbackupp of aarchivvelog scn ffrom 11185622509055List of Baackup Sets=BSS Key Sizee Devvice TType EElapseed Ti

28、mme Commpletiion Tiime- - - - -680 2265K DISK 00:00:000 16-MAAR-09 BP Keey: 6881 SStatuss: AVAAILABLLE TTag: TTAG2000903166T1547731Pieece Naame: /d02/ffullbaackup/200900316_aarch_228Listt of AArchivved Loogs inn backkup seet 6800Thrd Seq Loow SCNN LLow Tiime NNext SSCN Next Time- - - - - -1 1009 118

29、5562508805 166-MAR-09 1118562551483 16-MAAR-0911 1110 1188562511483 116-MARR-09 11185622514877 16-MMAR-099查找sequeence 1110 以后后的archhiveloog是否有備備份RMAN llist ccopy oof arcchivellog frrom seequencce 1100;List off Archhived Log CCopiessKey Thhrd Seeq S Loow Timme Naame- - - - - -6694 1 1111 A 16-MAR-009

30、 /d002/arcch/1_1111.dbbf695 11 1112 A 116-MARR-09 /d02/aarch/11_112.dbf查詢onlinne arcchive logSQL seelect sequeence#,membeers,arrchiveed,staatus ffrom vv$log;SEQUENCCE# MEMBBERS AARC STTATUS- - - -113 11 NO CURREENT1111 1 YESS INACCTIVE1112 1 YYES INNACTIVVE從以上查詢中可可以看出daata有一次次最近的全備備份,有全備備份以來的所所有arch

31、hiveloog,onlline rredo llog下面開開始blocckreoccver,其其實命令很簡簡單RMAN bblockrrecoveer datta bloock 188;Startinng bloockreccover at 166-MAR-09alllocateed chaannel: ORA_DISK_1channnel OORA_DIISK_1: sid=16 deevtypee=DISKKchannell ORA_DISK_1: reestoriing bllock(ss)channnel OORA_DIISK_1: speccifyinng bloock(s) to rrestorre froom bacckup ssetresstorinng bloocks oof dattachannnel OORA_DIISK_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論