Oracle數據庫的后備和恢復
當我們使用一個數據庫時,總希望數據庫的內容是可靠的、正確的,但由于計算機系統的故障(硬件故障、軟件故障、網絡故障、進程故障和系統故障)影響數據庫系統的操作,影響數據庫中數據的正確性,甚至破壞數據庫,使數據庫中全部或部分數據丟失。因此當發生上述故障后,希望能重新建立一個完整的數據庫,該處理稱為數據庫恢復。恢復子系統是數據庫管理系統的一個重要組成部分。恢復處理隨所發生的故障類型所影響的結構而變化。
一、恢復數據庫所使用的結構
Oracle數據庫使用幾種結構對可能故障來保護數據:數據庫后備、日志、回滾段和控制文件。
數據庫后備是由構成Oracle數據庫的物理文件的操作系統后備所組成。當介質故障時進行數據庫恢復,利用后備文件恢復毀壞的數據文件或控制文件。
日志,每一個Oracle數據庫實例都提供,記錄數據庫中所作的全部修改。一個實例的日志至少由兩個日志文件組成,當實例故障或介質故障時進行數據庫部分恢復,利用數據庫日志中的改變應用于數據文件,修改數據庫數據到故障出現的時刻。數據庫日志由兩部分組成:在線日志和歸檔日志。
每一個運行的Oracle數據庫實例相應地有一個在線日志,它與Oracle后臺進程LGWR一起工作,立即記錄該實例所作的全部修改。在線日志由兩個或多個預期分配的文件組成,以循環方式使用。
歸檔日志是可選擇的,一個Oracle數據庫實例一旦在線日志填滿后,可形成在線日志的歸檔文件。歸檔的在線日志文件被唯一標識并合成歸檔日志。
回滾段用于存儲正在進行的事務(為未提交的事務)所修改值的老值,該信息在數據庫恢復過程中用于撤消任何非提交的修改。
控制文件,一般用于存儲數據庫的物理結構的狀態。控制文件中某些狀態信息在實例恢復和介質恢復期間用于引導Oracle。
二、在線日志
一個Oracle數據庫的每一實例有一個相關聯的在線日志。一個在線日志由多個在線日志文件組成。在線日志文件填入日志項,日志項記錄的數據用于重構對數據庫所作的全部修改。后臺進程LGWR以循環方式寫入在線日志文件。當當前的在線日志文件寫滿后,LGWR寫入到下一可用在線日志文件。當最后一個可用的在線日志文件的檢查點已完成時即可使用。如果歸檔不實施,一個已填滿的在線日志文件一當包含該在線日志文件的檢查點完成,該文件已被歸檔后即可使用。在任何時候,僅有一個在線日志文件被寫入存儲日志項,它被稱為活動的或當前在線日志文件,其它的在線日志文件為不活動的在線日志文件。
Oracle結束寫入一在線日志文件并開始寫入到另一個在線日志文件的點稱為日志開關。日志開關在當前在線日志文件完全填滿,必須繼續寫入到下一個在線日志文件時出現,也可由DBA強制日志開關。每一日志開關出現時,每一在線日志文件賦給一個新的日志序列號。如果在線日志文件被歸檔,在歸檔日志文件中包含有它的日志序列號。
Oracle后臺進程DBWR(數據庫寫)將SGA中所有被修改的數據庫緩沖區(包含提交和未提交的)寫入到數據文件,這樣的事件稱為出現一個檢查點。因下列原因實現檢查點:
檢查點確保將內存中經常改變的數據段塊每隔一定時間寫入到數據文件。由于DBWR使用最近最少使用算法,經常修改的數據段塊從不會作為最近最少使用塊,如果檢查點不出現,它從不會寫入磁盤。
由于直至檢查點時所有的數據庫修改已記錄到數據文件,先于檢查點的日志項在實例恢復時不再需要應用于數據文件,所以檢查點可加快實例恢復。
雖然檢查點有一些開銷,但Oracle既不停止活動又不影響當前事務。由于DBWR不斷地將數據庫緩沖區寫入到磁盤,所以一個檢查點一次不必寫許多數據塊。一個檢查點保證自前一個檢查點以來的全部修改數據塊寫入到磁盤。檢查點不管填滿的在線日志文件是否正在歸檔,它總是出現。如果實施歸檔,在LGWR重用在線日志文件之前,檢查點必須完成并且所填滿的在線日志文件必須被歸檔。
檢查點可對數據庫的全部數據文件出現(稱為數據庫檢查點),也可對指定的數據文件出現。下面說明一下什么時候出現檢查點及出現什么情況:
在每一個日志開關處自動地出現一數據庫檢查點。如果前一個數據庫檢查點正在處理,由日志開關實施的檢查點優于當前檢查點。
初始化參數據LOG-CHECKPOINT-INTERVAL設置所實施的數據庫檢查點,當預定的日志塊數被填滿后(自最后一個數據庫檢查點以來),實施一數據庫檢查點。另一個參數LOG-CHECKPOINT-TIMEOUT可設置自上一個數據庫檢查點開始之后指定秒數后實施一數據庫檢查點。這種選擇對使用非常大的日志文件時有用,它在日志開頭之間增加檢查點。由初始化參數所啟動的數據庫檢查點只有在前一個檢查點完成后才能啟動。
當一在線表空間開始后備時,僅對構成該空間的數據文件實施一檢查點,該檢查點壓倒仍在進行中的任何檢查點。
當DBA使一表空間離線時,僅對構成該表空間的在線文件實施一檢查點。
當DBA以正常或立即方式關閉一實例時,Oracle在實例關閉之前實施一數據庫檢查點,該檢查點壓倒任何運行檢查點。
DBA可要求實施一數據庫檢查點,該檢查點壓倒任何運行檢查點。
檢查點機制:當檢查點出現時,檢查點后臺進程記住寫入在線文件的下一日志行的位置,并通知數據庫寫后臺進程將SGA中修改的數據庫緩沖區寫入到磁盤上的數據文件。然后由CKPT修改全部控制文件和數據文件的標頭,反映該最后檢查點。當檢查點不發生,DBWR當需要時僅將最近最少使用的數據庫緩沖區寫入磁盤,為新數據準備緩沖區。
鏡象在線日志文件:為了安全將實例的在線日志文件鏡象到它的在線日志文件ORACLE提供鏡象功能。當具有鏡象在線日志文件時,LGWR同時將同一日志信息寫入到多個同樣的在線日志文件。日志文件分成組,每個組中的日志文件稱為成員,每個組中的全部成員同時活動,由LGWR賦給相同的日志序列號。如果使用鏡象在線日志,則可建立在線日志文件組,在組中的每一成員要求是同一大小。
鏡象在線日志的機制:LGWR總是尋找組的全部成員,對一組的全部成員并行地寫,然后轉換到下一組的全部成員,并行地寫。
每個數據庫實例有自己的在線日志組,這些在線日志組可以是鏡象的或不是,稱為實例的在線日志線索。在典型配置中,一個數據庫實例存取一個ORACLE數據庫,于是僅一個線索存在。然而在運行ORACLE并行服務器中,兩個或多個實例并行地存取單個數據庫,在這種情況下,每個實例有自己的線索。
三、歸檔日志
Oracle要將填滿的在線日志文件組歸檔時,則要建立歸檔日志,或稱離線日志。其對數據庫后備和恢復有下列用處:
數據庫后備以及在線和歸檔日志文件,在操作系統或磁盤故障中可保證全部提交的事務可被恢復。
在數據庫打開時和正常系統使用下,如果歸檔日志是永久保持,在線后備可以進行和使用。
如果用戶數據庫要求在任何磁盤故障的事件中不丟失任何數據,那么歸檔日志必須要存在。歸檔已填滿的在線日志文件可能需要DBA執行額外的管理操作。
歸檔機制:決定于歸檔設置,歸檔已填滿的在線日志組的機制可由Oracle后臺進程ARCH自動歸檔或由用戶進程發出語句手工地歸檔。當日志組變為不活動、日志開關指向下一組已完成時,ARCH可歸檔一組,可存取該組的任何或全部成員,完成歸檔組。在線日志文件歸檔之后才可為LGWR重用。當使用歸檔時,必須指定歸檔目標指向一存儲設備,它不同于個有數據文件、在線日志文件和控制文件的設備,理想的是將歸檔日志文件永久地移到離線存儲設備、如磁帶。
數據庫可運行在兩種不同方式下:NOARCHIVELOG方式或ARCHIVELOG方式。數據庫在NOARCHIVELOG方式下使用時,不能進行在線日志的歸檔。在該數據庫控制文件指明填滿的組不需要歸檔,所以一當填滿的組成為活動,在日志開關的檢查點完成,該組即可被LGWR重用。在該方式下僅能保護數據庫實例故障,不能保護介質(磁盤)故障。利用存儲在在線日志中的信息,可實現實例故障恢復。
如果數據庫在ARCHIVELOG方式下,可實施在線日志的歸檔。在控制文件中指明填滿的日志文件組在歸檔之前不能重用。一旦組成為不活動,執行歸檔的進程立即可使用該組。
在實例起動時,通過參數LOG-ARCHIVE-START設置,可啟動ARCH進程,否則ARCH進程在實例啟動時不能被啟動。然而DBA在憑借時候可交互地啟動或停止自動歸檔。 一旦在線日志文件組變為不活動時,ARCH進程自動對它歸檔。
如果數據庫在ARCHIVELOG方式下運行,DBA可手工歸檔填滿的不活動的日志文件組,不管自動歸檔是可以還是不可以。
四、數據庫后備
不管為ORACLE數據庫設計成什么樣的后備或恢復模式,數據庫數據文件、日志文件和控制文件的操作系統后備是絕對需要的,它是保護介質故障的策略部分。操作系統后備有完全后備和部分后備:
完全后備
一個完全后備將構成ORACLE數據庫的全部數據庫文件、在線日志文件和控制文件的一個操作系統后備。一個完全后備在數據庫正常關閉之后進行,不能在實例故障后進行。在此時,所有構成數據庫的全部文件是關閉的,并與當前點相一致。在數據庫打開時不能進行完全后備。由完全后備得到的數據文件在任何類型的介質恢復模式中是有用的。
部分后備
部分后備為除完全后備外的任何操作系統后備,可在數據庫打開或關閉下進行。如單個表空間中全部數據文件后備、單個數據文件后備和控制文件后備。部分后備僅對在ARCHIVELOG方式下運行數據庫有用,因為存在的歸檔日志,數據文件可由部分后備恢復。在恢復過程中與數據庫其它部分一致。
五、數據庫恢復
實例故障的恢復
當實例意外地(如掉電、后臺進程故障等)或預料地(發出SHUTDOUM ABORT語句)中止時出現實例故障,此時需要實例恢復。實例恢復將數據庫恢復一故障之前的事務一致狀態。如果在在線后備發現實例故障,則需介質恢復。在其它情況Oracle在下次數據庫起動時(對新實例裝配和打開),自動地執行實例恢復。如果需要,從裝配狀態變為打開狀態,自動地激發實例恢復,由下列處理:
(1)為了解恢復數據文件中沒有記錄的數據,進行向前滾。該數據記錄在在線日志,包括對回滾段的內容恢復。
(2)回滾未提交的事務,按步1重新生成回滾段所指定的操作。
(3)釋放在故障時正在處理事務所持有的資源。
(4)解決在故障時正經歷一階段提交的任何懸而未決的分布事務。
介質故障的恢復
介質故障是當一個文件、一個文件的部分或一磁盤不能讀或不能寫時出現的故障。介質故障的恢復有兩種形式,決定于數據庫運行的歸檔方式。
如果數據庫是可運行的,以致它的在線日志僅可重用但不能歸檔,此時介質恢復為使用最新的完全后備的簡單恢復。在完全后備執行的工作必須手工地重作。
如果數據庫可運行,其在線日志是被歸檔的,該介質故障的恢復是一個實際恢復過程,重構受損的數據庫恢復到介質故障前的一個指定事務一致狀態。
不管哪種形式,介質故障的恢復總是將整個數據庫恢復到故障之前的一個事務一致狀態。如果數據庫是在ARCHIVELOG方式運行,可有不同類型的介質恢復:完全介質恢復和不完全介質恢復。
完全介質恢復可恢復全部丟失的修改。僅當所有必要的日志可用時才可能。有不同類型的完全介質恢復可使用,其決定于毀壞文件和數據庫的可用性。例:
關閉數據庫的恢復。當數據庫可被裝配卻是關閉的,完全不能正常使用,此時可進行全部的或單個毀壞數據文件的完全介質恢復。
打開數據庫的離線表空間的恢復。當數據庫是打開的,完全介質恢復可以處理。未損的數據庫表空間是在線的可以使用,而受損耗捕空間是離線的,其所有數據文件作為恢復的單位。
打開數據庫的離線表間的單個數據文件的恢復。當數據庫是打開的,完全介質恢復可以處理。未損的數據庫表空間是在線的可以使用,而所損的表空間是離線的,該表空間的指定所損的數據文件可被恢復。
使用后備的控制文件的完全介質恢復。當控制文件所有拷貝由于磁盤故障而受損時,可進行介質恢復而不丟失數據。
不完全介質恢復是在完全介質恢復不可能或不要求時進行的介質恢復。重構受損的數據庫,使其恢復介質故障前或用戶出錯之前的一個事務一致性狀態。不完全介質恢復有不同類型的使用,決定于需要不完全介質恢復的情況,有下列類型:基于撤消、基于時間和基于修改的不完全恢復。
基于撤消恢復:在某種情況,不完全介質恢復必須被控制,DBA可撤消在指定點的操作。基于撤消的恢復地在一個或多個日志組(在線的或歸檔的)已被介質故障所破壞,不能用于恢復過程時使用,所以介質恢復必須控制,以致在使用最近的、未損的日志組于數據文件后中止恢復操作。
基于時間和基于修改的恢復:如果DBA希望恢復到過去的某個指定點,不完全介質恢復地理想的。可在下列情況下使用:
當用戶意外地刪除一表,并注意到錯誤提交的估計時間,DBA可立即關閉數據庫,恢復它到用戶錯誤之前時刻。
由于系統故障,一個在線日志文件的部分被破壞,所以活動的日志文件突然不可使用,實例被中止,此時需要介質恢復。在恢復中可使用當前在線日志文件的未損部分,DBA利用基于時間的恢復,一旦有將效的在線日志已應用于數據文件后停止恢復過程。
在這兩種情況下,不完全介質恢復的終點可由時間點或系統修改號(SCN)來指定。
【編輯推薦】