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