時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)
1? 簡介
Oracle數(shù)據(jù)庫提供了下列兩類失敗模式下的數(shù)據(jù)庫恢復(fù):
1.實例失?。簛G失了Oracle數(shù)據(jù)緩存中的數(shù)據(jù)或者內(nèi)存中的數(shù)據(jù)
2.介質(zhì)失?。簛G失了數(shù)據(jù)庫文件
上面兩種模式的任一種失敗情景,在恢復(fù)的時候想要保證數(shù)據(jù)庫一致性,都有一些前提條件必須滿足。
雖然恢復(fù)的過程有一些共同點,但前提條件的差異使得恢復(fù)的執(zhí)行也有很大差異:
1.實例恢復(fù):恢復(fù)Oracle數(shù)據(jù)緩存中丟失的數(shù)據(jù)
2.介質(zhì)恢復(fù):恢復(fù)數(shù)據(jù)庫文件丟失的數(shù)據(jù)
1.1? 實例恢復(fù)和介質(zhì)恢復(fù)的共同的機制
實例恢復(fù)和介質(zhì)恢復(fù)都依賴重做日志。重做日志由一些重做日志線程組成。單實例環(huán)境中重做日志只有一個重做線程,多實例環(huán)境中每個實例都有一個重做線程。
一個重做日志線程指的的是一組存放在操作系統(tǒng)上的文件,文件里記錄了該實例對數(shù)據(jù)庫的所有變更--已提交的變更和未提交的變更(后者指還存在Oracle數(shù)據(jù)緩存區(qū)中的數(shù)據(jù)塊變更)。因為實例也修改了回滾段中的塊,所以回滾段的變更也記錄在重做日志線程中。
實例恢復(fù)和介質(zhì)恢復(fù)的第一步都是前滾。前滾屬于數(shù)據(jù)庫恢復(fù)層面的。在前滾的過程中,重做日志中記錄的數(shù)據(jù)變更被重新應(yīng)用到數(shù)據(jù)文件中。因為回滾段的變更也記錄在重做日志中,所以前滾過程還會重新構(gòu)建回滾段塊。當(dāng)前滾結(jié)束時,重做日志中記錄的所有變更都應(yīng)用到數(shù)據(jù)文件上了。此刻,數(shù)據(jù)塊不僅包含了已經(jīng)提交的數(shù)據(jù),也包含了一些未提交的數(shù)據(jù)。
實例恢復(fù)和介質(zhì)恢復(fù)的第二步就是回滾?;貪L屬于數(shù)據(jù)庫事務(wù)層的任務(wù)?;貪L過程中,回滾段中記錄的由前滾導(dǎo)致的未提交的事務(wù)所做的修改將被撤銷。
1.2? 實例失敗和恢復(fù),崩潰失敗和恢復(fù)
實例失敗指當(dāng)實例突然終止時(如因為shutdown abort或主機掉電),實例數(shù)據(jù)緩存中的內(nèi)容就都丟失了。
崩潰失敗指數(shù)據(jù)庫的所有實例都同時失敗。單實例環(huán)境中實例失敗等同于崩潰失敗。崩潰恢復(fù)指的是將所有實例都恢復(fù)到崩潰前的一致狀態(tài)。這一切都是在命令alter database open 之后自動進行的,用戶無法干預(yù)。
實例失敗會損害數(shù)據(jù)庫的一致性因為它導(dǎo)致該實例的臟數(shù)據(jù)丟失。所謂"臟數(shù)據(jù)"就是指實例數(shù)據(jù)緩存中的數(shù)據(jù)塊內(nèi)容比數(shù)據(jù)文件上的要新。當(dāng)實例崩潰時,還沒有來得及將臟數(shù)據(jù)寫入到數(shù)據(jù)文件中。之所以導(dǎo)致存在這個臟數(shù)據(jù)丟失問題是因為Oracle的緩存管理采用的是有利于事務(wù)處理性能的算法而不是有利于防止實例崩潰的。如下這些有利于性能調(diào)優(yōu)的緩存管理算法使得實例恢復(fù)過程有點復(fù)雜:
1.LRU(最近最少使用)緩存替換算法
2.提交時不強制將臟數(shù)據(jù)刷新到數(shù)據(jù)文件中
上面的算法導(dǎo)致實例失敗時對數(shù)據(jù)庫完整性的損害體現(xiàn)在如下幾點:
A.在實例崩潰時,數(shù)據(jù)文件中可能包含一個原子事務(wù)修改的所有塊中的部分塊而不是全部
B.在實例崩潰時,數(shù)據(jù)文件中可能包含一些未提交事務(wù)修改的塊
C.在實例崩潰時,一些已提交事務(wù)修改的塊可能還沒有刷新到數(shù)據(jù)文件中,數(shù)據(jù)文件中包含的是該事務(wù)修改之前的數(shù)據(jù)塊。
在實例恢復(fù)過程中,數(shù)據(jù)庫恢復(fù)層修復(fù)了上面的損害點A和C,然后后續(xù)的數(shù)據(jù)庫事務(wù)層修復(fù)了損害點B。
除了那些用來修復(fù)數(shù)據(jù)庫完整性損害的前提條件外,實例恢復(fù)還需要滿足一些前提條件:
1.實例恢復(fù)必須在聯(lián)機的數(shù)據(jù)文件上進行恢復(fù)。
2.實例恢復(fù)必須使用聯(lián)機重做日志文件,不能要求使用歸檔重做日志文件。雖然實例恢復(fù)也可以通過使用歸檔重做日志文件進行恢復(fù)(數(shù)據(jù)庫運行在非歸檔模式除外),但那種恢復(fù)過程在要求用戶先還原歸檔日志文件的的時候是不能自動進行的。
3.實例恢復(fù)過程的調(diào)用是自動的,隱含的在下次數(shù)據(jù)庫啟動的時候被調(diào)用。
4.實例恢復(fù)過程中偵測修復(fù)的文件或修復(fù)過程本身都是自動進行的,無需人工干預(yù)。
5.實例恢復(fù)中前滾時間的長短是由Oracle數(shù)據(jù)庫內(nèi)部機制(checkpoint)和用戶配置的參數(shù)(如日志文件的大小和數(shù)量,checkpoint的頻率,并行恢復(fù)的參數(shù)等)決定的。
綜上所述,Oracle的內(nèi)存管理策略適合于性能調(diào)優(yōu)而不是降低實例崩潰的影響。本文描述了Oracle為解決采用這種LRU和提交不刷新數(shù)據(jù)塊的算法帶來的問題所用到的一些內(nèi)部機制。這些機制保證了實例恢復(fù)的前提條件得到滿足同時又兼顧了數(shù)據(jù)庫性能。這些機制如下:
1.提交前先刷新日志塊
這個機制修復(fù)損害C,保證了在事務(wù)提交的時候,所有跟該事務(wù)有關(guān)的重做日志記錄包括提交記錄都已經(jīng)寫入到重做日志文件中。
2.檢查點機制
界定了實例恢復(fù)時必須應(yīng)用的重做日志的量。這一點跟聯(lián)機日志切換結(jié)合起來使用確保實例恢復(fù)的時候只需要聯(lián)機重做日志和當(dāng)前聯(lián)機數(shù)據(jù)文件。
3.聯(lián)機重做日志切換機制
跟檢查點機制結(jié)合起來使用確保實例恢復(fù)的時候只需要聯(lián)機重做日志和當(dāng)前聯(lián)機數(shù)據(jù)文件。它保證當(dāng)前的檢查點總是超前即將被重用的聯(lián)機重做日志文件。
4.寫日志優(yōu)先
這個機制修復(fù)損害A,B,因為a)在實例崩潰時刻,數(shù)據(jù)文件上的所有變更都在重做日志中找到記錄;b)所有數(shù)據(jù)塊在寫到數(shù)據(jù)文件之前都先寫入跟回滾段和數(shù)據(jù)塊的重做記錄。
5.寫重做日志記錄是原子的
這個機制可以修復(fù)損害A,B。(注:每筆重做日志記錄都是由三個部分組成:重做日志記錄頭,回滾段改變向量,數(shù)據(jù)庫改變向量。這三部分在寫入重做日志時是原子的,不可分割的?。?/p>
6.線程打開標(biāo)志位
用于數(shù)據(jù)庫啟動時判斷是否需要崩潰恢復(fù)。
1.3? 介質(zhì)失敗和恢復(fù)
實例失敗影響邏輯上的數(shù)據(jù)庫完整性。因為實例失敗的時候數(shù)據(jù)文件是可以恢復(fù)到一致狀態(tài)的,實例恢復(fù)以當(dāng)前數(shù)據(jù)文件為起點,用聯(lián)機重做日志進行恢復(fù)。
介質(zhì)失敗則不同,影響的是物理上的數(shù)據(jù)庫完整性或可用性。因為數(shù)據(jù)文件已經(jīng)損壞,介質(zhì)恢復(fù)要先還原該數(shù)據(jù)文件的備份作為介質(zhì)恢復(fù)的起點,用歸檔重做日志和聯(lián)機重做日志做前滾操作,直至數(shù)據(jù)文件備份后實例崩潰前最近的一個一致狀態(tài)或者數(shù)據(jù)文件備份后實例崩潰前的任意一個一致狀態(tài)。介質(zhì)恢復(fù)操作必須由下面命令來執(zhí)行:RECOVER DATABASE, RECOVER TABLESPACE, RECOVER DATAFILE。
根據(jù)失敗場景分析,介質(zhì)失敗對數(shù)據(jù)庫完整性的破壞可能跟實例失敗一樣。如當(dāng)一個塊被讀入到數(shù)據(jù)緩沖區(qū)中修改后正要被DBWR進程將更新后的數(shù)據(jù)塊寫回到數(shù)據(jù)文件中時發(fā)生I/O故障,也可能導(dǎo)致前面提到的A,B,C三點損害.此外,介質(zhì)失敗時不僅僅是當(dāng)前臟數(shù)據(jù)永久丟失了,而且該數(shù)據(jù)文件上自上次備份后的所有更新的都丟失了。
在介質(zhì)恢復(fù)之前,必須先還原被損壞的數(shù)據(jù)文件。然后在這些數(shù)據(jù)文件上應(yīng)用相關(guān)的歸檔日志和聯(lián)機重做日志前滾到介質(zhì)失敗前的一致狀態(tài)。
介質(zhì)恢復(fù)和實例恢復(fù)上面提到A,B,C三種損害有一些共同的前提條件。然而介質(zhì)恢復(fù)和實例恢復(fù)的前提條件還是有如下五點不同:
1.介質(zhì)恢復(fù)前必須先還原受損壞的數(shù)據(jù)文件。
2.介質(zhì)恢復(fù)除了要求聯(lián)機重做日志外還要有歸檔重做日志。
3.介質(zhì)恢復(fù)必須顯示調(diào)用,需要人工干預(yù)。
4.介質(zhì)失敗不能自動被偵測到。只有在某個數(shù)據(jù)文件或數(shù)據(jù)庫備份被還原的時候才能自動偵測到需要介質(zhì)恢復(fù)。
5.介質(zhì)恢復(fù)所用的前滾時間長短是由用戶備份策略決定的(如備份的頻率,并行恢復(fù)參數(shù)等),而不是有Oracle內(nèi)部機制決定。
2? 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
2.1? Controlfile
控制文件包含了數(shù)據(jù)庫中所有其他文件的狀態(tài)信息。
控制文件包含了如下幾類數(shù)據(jù):
A.數(shù)據(jù)庫信息記錄(一條)
B.數(shù)據(jù)文件記錄(每個數(shù)據(jù)文件一條)
C.線程記錄(每個線程一條。注:每個實例一個線程)
D.日志文件記錄(每個日志文件一條)
E.文件名記錄(每個數(shù)據(jù)文件或者日志文件成員一條)
F.日志歷史記錄(每個已經(jīng)完成的日志文件一條)
控制文件的被后面文檔引用到的字段如下,后面是引用該字段的章節(jié):
2.1.1? 數(shù)據(jù)庫信息記錄(控制文件)
所含字段:
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)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法