IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁(yè)數(shù)據(jù)庫(kù)Oracle → Oracle恢復(fù)內(nèi)部原理

Oracle恢復(fù)內(nèi)部原理

時(shí)間:2015/6/28來(lái)源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)

  1  簡(jiǎn)介

  oracle數(shù)據(jù)庫(kù)提供了下列兩類失敗模式下的數(shù)據(jù)庫(kù)恢復(fù):

  1.實(shí)例失。簛G失了Oracle數(shù)據(jù)緩存中的數(shù)據(jù)或者內(nèi)存中的數(shù)據(jù)

  2.介質(zhì)失敗:丟失了數(shù)據(jù)庫(kù)文件

  上面兩種模式的任一種失敗情景,在恢復(fù)的時(shí)候想要保證數(shù)據(jù)庫(kù)一致性,都有一些前提條件必須滿足。

  雖然恢復(fù)的過(guò)程有一些共同點(diǎn),但前提條件的差異使得恢復(fù)的執(zhí)行也有很大差異:

  1.實(shí)例恢復(fù):恢復(fù)Oracle數(shù)據(jù)緩存中丟失的數(shù)據(jù)

  2.介質(zhì)恢復(fù):恢復(fù)數(shù)據(jù)庫(kù)文件丟失的數(shù)據(jù)

  1.1  實(shí)例恢復(fù)和介質(zhì)恢復(fù)的共同的機(jī)制

  實(shí)例恢復(fù)和介質(zhì)恢復(fù)都依賴重做日志。重做日志由一些重做日志線程組成。單實(shí)例環(huán)境中重做日志只有一個(gè)重做線程,多實(shí)例環(huán)境中每個(gè)實(shí)例都有一個(gè)重做線程。

  一個(gè)重做日志線程指的的是一組存放在操作系統(tǒng)上的文件,文件里記錄了該實(shí)例對(duì)數(shù)據(jù)庫(kù)的所有變更--已提交的變更和未提交的變更(后者指還存在Oracle數(shù)據(jù)緩存區(qū)中的數(shù)據(jù)塊變更)。因?yàn)閷?shí)例也修改了回滾段中的塊,所以回滾段的變更也記錄在重做日志線程中。

  實(shí)例恢復(fù)和介質(zhì)恢復(fù)的第一步都是前滾。前滾屬于數(shù)據(jù)庫(kù)恢復(fù)層面的。在前滾的過(guò)程中,重做日志中記錄的數(shù)據(jù)變更被重新應(yīng)用到數(shù)據(jù)文件中。因?yàn)榛貪L段的變更也記錄在重做日志中,所以前滾過(guò)程還會(huì)重新構(gòu)建回滾段塊。當(dāng)前滾結(jié)束時(shí),重做日志中記錄的所有變更都應(yīng)用到數(shù)據(jù)文件上了。此刻,數(shù)據(jù)塊不僅包含了已經(jīng)提交的數(shù)據(jù),也包含了一些未提交的數(shù)據(jù)。

  實(shí)例恢復(fù)和介質(zhì)恢復(fù)的第二步就是回滾;貪L屬于數(shù)據(jù)庫(kù)事務(wù)層的任務(wù)。回滾過(guò)程中,回滾段中記錄的由前滾導(dǎo)致的未提交的事務(wù)所做的修改將被撤銷。

  1.2  實(shí)例失敗和恢復(fù),崩潰失敗和恢復(fù)

  實(shí)例失敗指當(dāng)實(shí)例突然終止時(shí)(如因?yàn)閟hutdown abort或主機(jī)掉電),實(shí)例數(shù)據(jù)緩存中的內(nèi)容就都丟失了。

  崩潰失敗指數(shù)據(jù)庫(kù)的所有實(shí)例都同時(shí)失敗。單實(shí)例環(huán)境中實(shí)例失敗等同于崩潰失敗。崩潰恢復(fù)指的是將所有實(shí)例都恢復(fù)到崩潰前的一致?tīng)顟B(tài)。這一切都是在命令alter database open 之后自動(dòng)進(jìn)行的,用戶無(wú)法干預(yù)。

  實(shí)例失敗會(huì)損害數(shù)據(jù)庫(kù)的一致性因?yàn)樗鼘?dǎo)致該實(shí)例的臟數(shù)據(jù)丟失。所謂"臟數(shù)據(jù)"就是指實(shí)例數(shù)據(jù)緩存中的數(shù)據(jù)塊內(nèi)容比數(shù)據(jù)文件上的要新。當(dāng)實(shí)例崩潰時(shí),還沒(méi)有來(lái)得及將臟數(shù)據(jù)寫(xiě)入到數(shù)據(jù)文件中。之所以導(dǎo)致存在這個(gè)臟數(shù)據(jù)丟失問(wèn)題是因?yàn)镺racle的緩存管理采用的是有利于事務(wù)處理性能的算法而不是有利于防止實(shí)例崩潰的。如下這些有利于性能調(diào)優(yōu)的緩存管理算法使得實(shí)例恢復(fù)過(guò)程有點(diǎn)復(fù)雜:

  1.LRU(最近最少使用)緩存替換算法

  2.提交時(shí)不強(qiáng)制將臟數(shù)據(jù)刷新到數(shù)據(jù)文件中

  上面的算法導(dǎo)致實(shí)例失敗時(shí)對(duì)數(shù)據(jù)庫(kù)完整性的損害體現(xiàn)在如下幾點(diǎn):

  A.在實(shí)例崩潰時(shí),數(shù)據(jù)文件中可能包含一個(gè)原子事務(wù)修改的所有塊中的部分塊而不是全部

  B.在實(shí)例崩潰時(shí),數(shù)據(jù)文件中可能包含一些未提交事務(wù)修改的塊

  C.在實(shí)例崩潰時(shí),一些已提交事務(wù)修改的塊可能還沒(méi)有刷新到數(shù)據(jù)文件中,數(shù)據(jù)文件中包含的是該事務(wù)修改之前的數(shù)據(jù)塊。

  在實(shí)例恢復(fù)過(guò)程中,數(shù)據(jù)庫(kù)恢復(fù)層修復(fù)了上面的損害點(diǎn)A和C,然后后續(xù)的數(shù)據(jù)庫(kù)事務(wù)層修復(fù)了損害點(diǎn)B。

  除了那些用來(lái)修復(fù)數(shù)據(jù)庫(kù)完整性損害的前提條件外,實(shí)例恢復(fù)還需要滿足一些前提條件:

  1.實(shí)例恢復(fù)必須在聯(lián)機(jī)的數(shù)據(jù)文件上進(jìn)行恢復(fù)。

  2.實(shí)例恢復(fù)必須使用聯(lián)機(jī)重做日志文件,不能要求使用歸檔重做日志文件。雖然實(shí)例恢復(fù)也可以通過(guò)使用歸檔重做日志文件進(jìn)行恢復(fù)(數(shù)據(jù)庫(kù)運(yùn)行在非歸檔模式除外),但那種恢復(fù)過(guò)程在要求用戶先還原歸檔日志文件的的時(shí)候是不能自動(dòng)進(jìn)行的。

  3.實(shí)例恢復(fù)過(guò)程的調(diào)用是自動(dòng)的,隱含的在下次數(shù)據(jù)庫(kù)啟動(dòng)的時(shí)候被調(diào)用。

  4.實(shí)例恢復(fù)過(guò)程中偵測(cè)修復(fù)的文件或修復(fù)過(guò)程本身都是自動(dòng)進(jìn)行的,無(wú)需人工干預(yù)。

  5.實(shí)例恢復(fù)中前滾時(shí)間的長(zhǎng)短是由Oracle數(shù)據(jù)庫(kù)內(nèi)部機(jī)制(checkpoint)和用戶配置的參數(shù)(如日志文件的大小和數(shù)量,checkpoint的頻率,并行恢復(fù)的參數(shù)等)決定的。

  綜上所述,Oracle的內(nèi)存管理策略適合于性能調(diào)優(yōu)而不是降低實(shí)例崩潰的影響。本文描述了Oracle為解決采用這種LRU和提交不刷新數(shù)據(jù)塊的算法帶來(lái)的問(wèn)題所用到的一些內(nèi)部機(jī)制。這些機(jī)制保證了實(shí)例恢復(fù)的前提條件得到滿足同時(shí)又兼顧了數(shù)據(jù)庫(kù)性能。這些機(jī)制如下:

  1.提交前先刷新日志塊

  這個(gè)機(jī)制修復(fù)損害C,保證了在事務(wù)提交的時(shí)候,所有跟該事務(wù)有關(guān)的重做日志記錄包括提交記錄都已經(jīng)寫(xiě)入到重做日志文件中。

  2.檢查點(diǎn)機(jī)制

  界定了實(shí)例恢復(fù)時(shí)必須應(yīng)用的重做日志的量。這一點(diǎn)跟聯(lián)機(jī)日志切換結(jié)合起來(lái)使用確保實(shí)例恢復(fù)的時(shí)候只需要聯(lián)機(jī)重做日志和當(dāng)前聯(lián)機(jī)數(shù)據(jù)文件。

  3.聯(lián)機(jī)重做日志切換機(jī)制

  跟檢查點(diǎn)機(jī)制結(jié)合起來(lái)使用確保實(shí)例恢復(fù)的時(shí)候只需要聯(lián)機(jī)重做日志和當(dāng)前聯(lián)機(jī)數(shù)據(jù)文件。它保證當(dāng)前的檢查點(diǎn)總是超前即將被重用的聯(lián)機(jī)重做日志文件。

  4.寫(xiě)日志優(yōu)先

  這個(gè)機(jī)制修復(fù)損害A,B,因?yàn)閍)在實(shí)例崩潰時(shí)刻,數(shù)據(jù)文件上的所有變更都在重做日志中找到記錄;b)所有數(shù)據(jù)塊在寫(xiě)到數(shù)據(jù)文件之前都先寫(xiě)入跟回滾段和數(shù)據(jù)塊的重做記錄。

  5.寫(xiě)重做日志記錄是原子的

  這個(gè)機(jī)制可以修復(fù)損害A,B。(注:每筆重做日志記錄都是由三個(gè)部分組成:重做日志記錄頭,回滾段改變向量,數(shù)據(jù)庫(kù)改變向量。這三部分在寫(xiě)入重做日志時(shí)是原子的,不可分割的。

  6.線程打開(kāi)標(biāo)志位

  用于數(shù)據(jù)庫(kù)啟動(dòng)時(shí)判斷是否需要崩潰恢復(fù)。

  1.3  介質(zhì)失敗和恢復(fù)

  實(shí)例失敗影響邏輯上的數(shù)據(jù)庫(kù)完整性。因?yàn)閷?shí)例失敗的時(shí)候數(shù)據(jù)文件是可以恢復(fù)到一致?tīng)顟B(tài)的,實(shí)例恢復(fù)以當(dāng)前數(shù)據(jù)文件為起點(diǎn),用聯(lián)機(jī)重做日志進(jìn)行恢復(fù)。

  介質(zhì)失敗則不同,影響的是物理上的數(shù)據(jù)庫(kù)完整性或可用性。因?yàn)閿?shù)據(jù)文件已經(jīng)損壞,介質(zhì)恢復(fù)要先還原該數(shù)據(jù)文件的備份作為介質(zhì)恢復(fù)的起點(diǎn),用歸檔重做日志和聯(lián)機(jī)重做日志做前滾操作,直至數(shù)據(jù)文件備份后實(shí)例崩潰前最近的一個(gè)一致?tīng)顟B(tài)或者數(shù)據(jù)文件備份后實(shí)例崩潰前的任意一個(gè)一致?tīng)顟B(tài)。介質(zhì)恢復(fù)操作必須由下面命令來(lái)執(zhí)行:RECOVER DATABASE, RECOVER TABLESPACE, RECOVER DATAFILE。

  根據(jù)失敗場(chǎng)景分析,介質(zhì)失敗對(duì)數(shù)據(jù)庫(kù)完整性的破壞可能跟實(shí)例失敗一樣。如當(dāng)一個(gè)塊被讀入到數(shù)據(jù)緩沖區(qū)中修改后正要被DBWR進(jìn)程將更新后的數(shù)據(jù)塊寫(xiě)回到數(shù)據(jù)文件中時(shí)發(fā)生I/O故障,也可能導(dǎo)致前面提到的A,B,C三點(diǎn)損害.此外,介質(zhì)失敗時(shí)不僅僅是當(dāng)前臟數(shù)據(jù)永久丟失了,而且該數(shù)據(jù)文件上自上次備份后的所有更新的都丟失了。

  在介質(zhì)恢復(fù)之前,必須先還原被損壞的數(shù)據(jù)文件。然后在這些數(shù)據(jù)文件上應(yīng)用相關(guān)的歸檔日志和聯(lián)機(jī)重做日志前滾到介質(zhì)失敗前的一致?tīng)顟B(tài)。

  介質(zhì)恢復(fù)和實(shí)例恢復(fù)上面提到A,B,C三種損害有一些共同的前提條件。然而介質(zhì)恢復(fù)和實(shí)例恢復(fù)的前提條件還是有如下五點(diǎn)不同:

  1.介質(zhì)恢復(fù)前必須先還原受損壞的數(shù)據(jù)文件。

  2.介質(zhì)恢復(fù)除了要求聯(lián)機(jī)重做日志外還要有歸檔重做日志。

  3.介質(zhì)恢復(fù)必須顯示調(diào)用,需要人工干預(yù)。

  4.介質(zhì)失敗不能自動(dòng)被偵測(cè)到。只有在某個(gè)數(shù)據(jù)文件或數(shù)據(jù)庫(kù)備份被還原的時(shí)候才能自動(dòng)偵測(cè)到需要介質(zhì)恢復(fù)。

  5.介質(zhì)恢復(fù)所用的前滾時(shí)間長(zhǎng)短是由用戶備份策略決定的(如備份的頻率,并行恢復(fù)參數(shù)等),而不是有Oracle內(nèi)部機(jī)制決定。

  2  基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)

  2.1  Controlfile

  控制文件包含了數(shù)據(jù)庫(kù)中所有其他文件的狀態(tài)信息。

  控制文件包含了如下幾類數(shù)據(jù):

  A.數(shù)據(jù)庫(kù)信息記錄(一條)

  B.數(shù)據(jù)文件記錄(每個(gè)數(shù)據(jù)文件一條)

  C.線程記錄(每個(gè)線程一條。注:每個(gè)實(shí)例一個(gè)線程)

  D.日志文件記錄(每個(gè)日志文件一條)

  E.文件名記錄(每個(gè)數(shù)據(jù)文件或者日志文件成員一條)

  F.日志歷史記錄(每個(gè)已經(jīng)完成的日志文件一條)

  控制文件的被后面文檔引用到的字段如下,后面是引用該字段的章節(jié):

  2.1.1  數(shù)據(jù)庫(kù)信息記錄(控制文件)

  所含字段:

  A.resetlogs timestamp: 8.2

  B.resetlogs scn: 8.2

  C.enabled thread bitvec: 8.3

  D.force archiving scn: 3.8

  E.database checkpoint thread(thread record index) : 2.13, 3.10

  2.1.3  數(shù)據(jù)文件記錄(控制文件)

  A.thread checkpoint structure: 2.12, 3.4, 8.3

  B.thread-open flag: 3.9, 3.11, 8.3

  C.current log (logfile record index)

  D.head and tail (logfile record indices) of list of logfiles in thread: 2.8

  2.1.4  日志文件記錄(控制文件)

  A.log sequence number: 2.7

  B.thread number: 8.4

  C.next and previous (logfile record indices) of list of logfiles in thread: 2.8

  D.count of files in group: 2.8

  E.low SCN: 2.7

  F.next SCN: 2.7

  G.head and tail (filename record indices) of list of filenames in group: 2.8

  H."being cleared" flag: 10.3

  I."archiving not needed" flag: 10.3

  2.1.5  文件名記錄(控制文件)

  A.filename

  B.filetype

  C

關(guān)鍵詞標(biāo)簽:Oracle恢復(fù)

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Oracle中使用alter table來(lái)增加,刪除,修改列Oracle中使用alter table來(lái)增加,刪除,修改列oracle中使用SQL語(yǔ)句修改字段類型-oracle修oracle中使用SQL語(yǔ)句修改字段類型-oracle修使用低權(quán)限Oracle數(shù)據(jù)庫(kù)賬戶得到管理員權(quán)限使用低權(quán)限Oracle數(shù)據(jù)庫(kù)賬戶得到管理員權(quán)限Oracle對(duì)user的訪問(wèn)控制Oracle對(duì)user的訪問(wèn)控制

相關(guān)下載

人氣排行 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法ORACLE和SQL語(yǔ)法區(qū)別歸納(1)oracle grant 授權(quán)語(yǔ)句如何加速Oracle大批量數(shù)據(jù)處理Oracle刪除表的幾種方法ORACLE修改IP地址后如何能夠使用Oracle 10g創(chuàng)建表空間和用戶并指定權(quán)限