淺談在Oracle中如何利用REDO實現(xiàn)故障恢復
在數(shù)據(jù)庫中,Redo的功能主要通過3個組件來實現(xiàn):Redo Log Buffer、LGWR后臺進程和Redo Log File(在歸檔模式下,Redo Log File最終會寫出為歸檔日志文件)。
在Oracle的SGA中,存在一塊共享內(nèi)存,稱為Redo Log Buffer,如圖1所示。

圖1 Oracle Instance
Redo Log Buffer位于SGA之中,是一塊循環(huán)使用的內(nèi)存區(qū)域,其中保存數(shù)據(jù)庫變更的相關(guān)信息。這些信息以重做條目(Redo Entries)形式存儲(Redo Entries也經(jīng)常被稱為Redo Records)。Redo Entries包含重構(gòu)、重做數(shù)據(jù)庫變更的重要信息,這些變更包括INSERT、UPDATE、DELETE、CREATE、ALTER或者DROP等。在必要的時候Redo Entries被用于數(shù)據(jù)庫恢復。
Redo Entries的內(nèi)容被Oracle數(shù)據(jù)庫進程從用戶的內(nèi)存空間復制到SGA中的Redo Log Buffer之中。Redo Entries在內(nèi)存中占用連續(xù)的順序空間,由于Redo Log Buffer是循環(huán)使用的,Oracle通過一個后臺進程LGWR不斷地把Redo Log Buffer的內(nèi)容寫出到Redo Log File中。
當用戶在Buffer Cache中修改數(shù)據(jù)時,Oracle并不會立即將修改數(shù)據(jù)寫出到數(shù)據(jù)文件上,因為那樣做效率會很低,到目前為止,計算機系統(tǒng)中最繁忙的部分是磁盤的I/O操作,Oracle這樣做的目的是為了減少IO的次數(shù),當修改過的數(shù)據(jù)達到一定數(shù)量之后,可以進行高效地批量寫出。
大部分傳統(tǒng)數(shù)據(jù)庫(當然包括Oracle)在處理數(shù)據(jù)修改時都遵循no-force-at-commit策略。也就是說,在提交時并不強制寫。那么為了保證數(shù)據(jù)在數(shù)據(jù)庫發(fā)生故障時(例如斷電)可以恢復,Oracle引入了Redo機制,通過連續(xù)的、順序的日志條目的寫出將隨機的、分散的數(shù)據(jù)塊的寫出推延。這個推延使得數(shù)據(jù)的寫出可以獲得批量效應的性能提升。
同Redo Log Buffer類似,Redo Log File也是循環(huán)使用的,Oracle允許使用最少兩個日志組。缺省情況下,數(shù)據(jù)庫創(chuàng)建時會建立3個日志組。
SQL> select group#,members,status from v$log;  | 
當一個日志文件寫滿之后,會切換到另外一個日志文件,這個切換過程稱為Log Switch。Log Switch會觸發(fā)一個檢查點,促使DBWR進程將寫滿的日志文件保護的變更數(shù)據(jù)寫回到數(shù)據(jù)庫。在檢查點完成之前,日志文件是不能夠被重用的。
由于Redo機制對于數(shù)據(jù)的保護,當數(shù)據(jù)庫發(fā)生故障時,Oracle就可以通過Redo重演進行數(shù)據(jù)恢復。那么一個非常重要的問題是,恢復應該從何處開始呢?
如果讀取的Redo過多,那么必然導致恢復的時間過長,在生產(chǎn)環(huán)境中,我們必需保證恢復時間要盡量得短。Oracle通過檢查點(Checkpoint)來縮減恢復時間?;仡櫼幌碌?章中所提到的內(nèi)容:檢查點只是一個數(shù)據(jù)庫事件,它存在的根本意義在于減少恢復時間。
當檢查點發(fā)生時(此時的SCN被稱為Checkpoint SCN)Oracle會通知DBWR進程,把修改過的數(shù)據(jù),也就是此Checkpoint SCN之前的臟數(shù)據(jù)(Dirty Buffer)從Buffer Cache寫入磁盤,在檢查點完成后CKPT進程會相應地更新控制文件和數(shù)據(jù)文件頭,記錄檢查點信息,標識變更。
在檢查點完成之后,此檢查點之前修改過的數(shù)據(jù)都已經(jīng)寫回磁盤,重做日志文件中的相應重做記錄對于崩潰/實例恢復不再有用。如果此后數(shù)據(jù)庫崩潰,那么恢復只需要從***一次完成的檢查點開始恢復即可。如果數(shù)據(jù)庫運行在歸檔模式(所有生產(chǎn)數(shù)據(jù)庫,都建議運行在歸檔模式),日志文件在重用之前必須寫出到歸檔日志文件,歸檔日志在介質(zhì)恢復時可以用來恢復數(shù)據(jù)庫故障
一、UNDO的使用說明
二、Undo段
在一個進程修改數(shù)據(jù)庫過程中存放舊的數(shù)據(jù),包括數(shù)據(jù)沒有修改之前的位置和值。Undo段的頭包含了一個事物處理表,表中存放了目前使用undo段事物處理的信息。一個系列的事物處理只使用一個undo段存放undo數(shù)據(jù)。多個并行事物處理可以同時寫入一個undo段。
三、Undo段的作用
1、事務處理rollback
當一個事物處理修改了表中的一行,舊數(shù)據(jù)的映像就會存放在undo段中。如果事物處理rollback,Oracle Server就使用undo段中值再寫回修改行。
2、事物處理恢復
當一個例程失敗而還有一些事物處理沒有完成,Oracle Server在數(shù)據(jù)庫再次打開的時候就需要將所有沒有提交的修改全部undo。這種rollback是事物處理恢復的一部分。由于undo段的修改也會被redo日志文件保護,因此恢復是能夠進行的。
3、讀取的一致性
當一個事物處理正在運行,其他的用戶是不能看到任何這個事物處理沒有提交的修改的。另外,在一個查詢執(zhí)行期間的數(shù)據(jù)改變是不應該顯示在這個查詢結(jié)果當中的。在undo段中的舊的數(shù)據(jù)(Undo數(shù)據(jù))也為用戶特定查詢提供一個一致的映像。
四、讀取的一致性
1、即使其他的事物處理修改了數(shù)據(jù),Oracle Server也會保證一個查詢看到的數(shù)據(jù)是一致的。當Oracle Server開始執(zhí)行一個select查詢,它將記錄目前系統(tǒng)更改編號(SCN)并且確保這個SCN以后的任何數(shù)據(jù)修改將不會影響到這個查詢結(jié)果。比如一個運行時間非常長的查詢語句在執(zhí)行過程中有發(fā)生了幾個修改,如果一行數(shù)據(jù)在查詢聲明以前的修改沒有提交,Oracle Server將從undo段中提取沒有修改的以前的映像,并構(gòu)建一個“讀取一致”的行映像。
2、事物處理讀取一致性
讀取的一致性通常是指SQL查詢語句。但是也可以通過在緊跟在事物處理聲明后使用一下命令來使事物處理的讀取也是一致的:
SET TRANSACTION READ ONLY;  | 
或者可以在事物處理使用DML語句的時候在事物處理前面使用一下命令:
SET TRANSACTION ISOLATION LELVEL SERIALIZABLE;  | 
使用上述兩種方法都可以保證事物處理在數(shù)據(jù)讀取時候的一致性,但是使用SERIALIZABLE參數(shù)將影響性能。
【編輯推薦】















 
 
 
 
 
 
 