1、概念
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比八宿網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式八宿網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋八宿地區(qū)。費(fèi)用合理售后完善,10余年實體公司更值得信賴。
REDO LOG是Oracle為確保已經(jīng)提交的事務(wù)不會丟失而建立的一個機(jī)制。實際上REDO LOG的存在是為兩種場景準(zhǔn)備的:
實例恢復(fù)(INSTANCE RECOVERY);
介質(zhì)恢復(fù)(MEDIA RECOVERY)。
實例恢復(fù)的目的是在數(shù)據(jù)庫發(fā)生故障時,確保BUFFER CACHE中的數(shù)據(jù)不會丟失,不會造成數(shù)據(jù)庫的不一致;
介質(zhì)恢復(fù)的目的是當(dāng)數(shù)據(jù)文件發(fā)生故障時,能夠恢復(fù)數(shù)據(jù)。
雖然這兩種恢復(fù)使用的機(jī)制類似的,但是這兩種恢復(fù)也有著十分本質(zhì)的不同,這一點也是很多DBA經(jīng)常會混淆的。
REDO LOG的數(shù)據(jù)是按照THREAD來組織的,對于單實例系統(tǒng)來說,只有一個THREAD,對于RAC系統(tǒng)來說,可能存在多個THREAD,每個數(shù)據(jù)庫實例擁有一組獨(dú)立的REDO LOG文件,擁有獨(dú)立的LOG BUFFER,某個實例的變化會被獨(dú)立的記錄到一個THREAD的REDO LOG文件中。
2、恢復(fù)步驟
對于介質(zhì)恢復(fù)和實例恢復(fù)來說,第一個步驟都是通過REDO LOG的信息進(jìn)行前滾,在做前滾的時候,通過REDO LOG文件里記錄的數(shù)據(jù)庫變化矢量,根據(jù)SCN的比對,提交到相關(guān)的數(shù)據(jù)文件上,從而使數(shù)據(jù)文件的狀態(tài)向前滾動。大家要注意的是,UNDO表空間的變化也被記錄到REDO LOG里了,因此UNDO表空間相關(guān)的數(shù)據(jù)文件也會被前滾。當(dāng)前滾到最后一個可用的REDO LOG或者歸檔日志的時候,所有的數(shù)據(jù)庫恢復(fù)層面的工作就全部完成了。這個時候,數(shù)據(jù)庫包含了所有的被記錄的變化,這些變化中有些是已經(jīng)提交,有些是尚未提交的。在最新狀態(tài)的UNDO表空間中,我們也可以看到一些尚未提交的事務(wù)。
因此數(shù)據(jù)庫下一步需要做的事情是事務(wù)層面的處理,回滾那些尚未提交的事務(wù),以確保數(shù)據(jù)庫的一致性。
對于單實例的系統(tǒng),實例恢復(fù)一般是在數(shù)據(jù)庫實例異常故障后數(shù)據(jù)庫重啟時進(jìn)行,當(dāng)數(shù)據(jù)庫執(zhí)行了SHUTDOWN ABORT或者由于操作系統(tǒng)、主機(jī)等原因宕機(jī)重啟后,在ALTER DATABASE OPEN的時候,就會自動做實例恢復(fù)。而在RAC環(huán)境中,如果某個實例宕了,活著的實例將會接管,替宕掉的實例做實例恢復(fù)。除非是所有的實例都宕了,這樣的話,第一個執(zhí)行ALTER DATABASE OPEN的實例將會做實例恢復(fù)。這也是REDO LOG是實例私有的組件,但是REDO LOG文件必須存放在共享存儲上的原因。
Oracle數(shù)據(jù)庫的CACHE機(jī)制是以性能為導(dǎo)向的,CACHE機(jī)制應(yīng)該最大限度的提高數(shù)據(jù)庫的性能,因此CACHE被寫入數(shù)據(jù)文件總是盡可能的推遲。這種機(jī)制大大提高了數(shù)據(jù)庫的性能,但是當(dāng)實例出現(xiàn)故障時,可能出現(xiàn)一些問題。
首先是在實例故障時,可能某些事物對數(shù)據(jù)文件的修改并沒有完全寫入磁盤,可能磁盤文件中丟失了某些已經(jīng)提交事務(wù)對數(shù)據(jù)文件的修改信息。其次是可能某些還沒有提交的事務(wù)對數(shù)據(jù)文件的修改已經(jīng)被寫入磁盤文件了。也有可能某個原子變更的部分?jǐn)?shù)據(jù)已經(jīng)被寫入文件,而部分?jǐn)?shù)據(jù)還沒有被寫入磁盤文件。實例恢復(fù)就是要通過ONLINE REDO LOG文件中記錄的信息,自動的完成上述數(shù)據(jù)的修復(fù)工作。這個過程是完全自動的,不需要人工干預(yù)。
在這個機(jī)制里,有兩個問題需要解決:
第一個是如何確保已經(jīng)提交的事務(wù)不會丟失;
第二個是如何在數(shù)據(jù)庫性能和實例恢復(fù)所需要的時間上做出平衡,既確保數(shù)據(jù)庫性能不會下降,又保證實例恢復(fù)的快速。
解決第一個問題比較簡單,Oracle有一個機(jī)制,叫做Log-Force-at-Commit,就是說,在事務(wù)提交的時候,和這個事務(wù)相關(guān)的REDO LOG數(shù)據(jù),包括COMMIT記錄,都必須從LOG BUFFER中寫入REDO LOG文件,此時事務(wù)提交成功的信號才能發(fā)送給用戶進(jìn)程。通過這個機(jī)制,可以確保哪怕這個已經(jīng)提交的事務(wù)中的部分BUFFER CACHE還沒有被寫入數(shù)據(jù)文件,就發(fā)生了實例故障,在做實例恢復(fù)的時候,也可以通過REDO LOG的信息,將不一致的數(shù)據(jù)前滾。
解決第二個問題,oracle是通過checkpoint機(jī)制來實現(xiàn)的。Oracle數(shù)據(jù)庫中,對BUFFER CAHCE的修改操作是前臺進(jìn)程完成的,但是前臺進(jìn)程只負(fù)責(zé)將數(shù)據(jù)塊從數(shù)據(jù)文件中讀到BUFFER CACHE中,不負(fù)責(zé)BUFFER CACHE寫入數(shù)據(jù)文件。BUFFER CACHE寫入數(shù)據(jù)文件的操作是由后臺進(jìn)程DBWR來完成的。DBWR可以根據(jù)系統(tǒng)的負(fù)載情況以及數(shù)據(jù)塊是否被其他進(jìn)程使用來將一部分?jǐn)?shù)據(jù)塊回寫到數(shù)據(jù)文件中。這種機(jī)制下,某個數(shù)據(jù)塊被寫回文件的時間可能具有一定的隨機(jī)性的,有些先修改的數(shù)據(jù)塊可能比較晚才被寫入數(shù)據(jù)文件。而CHECKPOINT機(jī)制就是對這個機(jī)制的一個有效的補(bǔ)充,CHECKPOINT發(fā)生的時候,CKPT進(jìn)程會要求DBWR進(jìn)程將某個SCN以前的所有被修改的塊都被寫回數(shù)據(jù)文件。這樣一旦這次CHECKPOINT完成后,這個SCN前的所有數(shù)據(jù)變更都已經(jīng)存盤,如果之后發(fā)生了實例故障,那么做實例恢復(fù)的時候,只需要沖這次CHECKPOINT已經(jīng)完成后的變化量開始就行了,CHECKPOINT之前的變化就不需要再去考慮了。
到目前為止,我們了解了實例恢復(fù)機(jī)制的一些基本的原理,我們也可以大體上理解REDO LOG的工作機(jī)制了。不過我想我們還需要再更加深入一些。了解一些更為深入的內(nèi)幕。實際上通過上面的介紹,大家也許已經(jīng)覺得對實例恢復(fù)了解的很透徹了,而實際上,有很多問題我們還沒有解決。有些愛動腦筋的讀者可能要問了,有沒有可能數(shù)據(jù)文件中的變化已經(jīng)寫盤,但是REDO LOG信息還在LOG BUFFER中,沒有寫入REDO LOG呢,這種情況如何恢復(fù)呢?
這里我們又要引入一個名詞:Write-Ahead-Log,就是日志寫入優(yōu)先。日志寫入優(yōu)先包含兩方面的算法:
第一個方面是,當(dāng)某個BUFFER CACHE的修改的變化矢量還沒有寫入REDO LOG文件之前,這個修改后的BUFFER CACHE的數(shù)據(jù)不允許被寫入數(shù)據(jù)文件,這樣就確保了再數(shù)據(jù)文件中不可能包含未在REDO LOG文件中記錄的變化;
第二個方面是,當(dāng)對某個數(shù)據(jù)的UNDO信息的變化矢量沒有被寫入REDO LOG之前,這個BUFFER CACHE的修改不能被寫入數(shù)據(jù)文件。
3、區(qū)別
介質(zhì)恢復(fù)和實例恢復(fù)的機(jī)制是類似的,所不同的是,介質(zhì)恢復(fù)是當(dāng)存儲的數(shù)據(jù)文件出現(xiàn)故障的時候進(jìn)行的,介質(zhì)恢復(fù)無法自動進(jìn)行,必須手工執(zhí)行recover Database或者recover datafile命令來實施。一般來說,介質(zhì)恢復(fù)是從一個恢復(fù)的數(shù)據(jù)文件為起點進(jìn)行恢復(fù),因此在做介質(zhì)恢復(fù)的時候,需要使用歸檔日志。