Oracle數(shù)據(jù)庫(kù)備份恢復(fù)概念 Oracle數(shù)據(jù)庫(kù)備份是對(duì)于數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)文件,包括數(shù)據(jù)文件,、日志文件和控制文件的備份,。數(shù)據(jù)庫(kù)備份又可分為完全數(shù)據(jù)庫(kù)備份和部分?jǐn)?shù)據(jù)庫(kù)備份。完全數(shù)據(jù)庫(kù)備份是對(duì)于構(gòu)成數(shù)據(jù)庫(kù)的全部數(shù)據(jù)庫(kù)文件,、在線(xiàn)日志文件和控制文件的一個(gè)備份,。完全數(shù)據(jù)庫(kù)備份只能是脫機(jī)備份,在數(shù)據(jù)庫(kù)正常關(guān)閉后進(jìn)行,。在數(shù)據(jù)庫(kù)關(guān)閉的時(shí)候文件的同步號(hào)與當(dāng)前檢查點(diǎn)一致,,不存在不同步的問(wèn)題,對(duì)于這一類(lèi)備份方法,,在復(fù)制回?cái)?shù)據(jù)庫(kù)備份文件后不需要進(jìn)行數(shù)據(jù)庫(kù)恢復(fù),。部分?jǐn)?shù)據(jù)庫(kù)備份可以在數(shù)據(jù)庫(kù)關(guān)閉和運(yùn)行的時(shí)候進(jìn)行。例如,,在數(shù)據(jù)庫(kù)關(guān)閉時(shí)備份一個(gè)數(shù)據(jù)文件或在數(shù)據(jù)庫(kù)聯(lián)機(jī)時(shí)備份一個(gè)數(shù)據(jù)表空間,。部分?jǐn)?shù)據(jù)庫(kù)備份由于存在數(shù)據(jù)庫(kù)文件之間的不同步,在備份文件復(fù)制回?cái)?shù)據(jù)庫(kù)時(shí)需要實(shí)施數(shù)據(jù)庫(kù)恢復(fù),,所以這種方式只能在歸檔模式下使用,,使用歸檔日志進(jìn)行數(shù)據(jù)庫(kù)恢復(fù)。 1 Oracle的日志文件 Oracle數(shù)據(jù)庫(kù)的日志文件(Redo Log Files,,也叫重做日志),,用于記錄對(duì)數(shù)據(jù)庫(kù)的修改操作信息,包括普通用戶(hù)對(duì)數(shù)據(jù)庫(kù)里的數(shù)據(jù)的修改也包括數(shù)據(jù)庫(kù)管理員對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)的修改,。因此,,數(shù)據(jù)庫(kù)的日志信息往往比數(shù)據(jù)信息還要多。比如說(shuō)當(dāng)用戶(hù)對(duì)一個(gè)表里的一個(gè)字段進(jìn)行修改,,修改完成后提交數(shù)據(jù)庫(kù),,這時(shí)數(shù)據(jù)文件中只需要存儲(chǔ)修改后的數(shù)據(jù),,但是日志文件則要記錄兩個(gè)值,一個(gè)是修改前的記錄值,,一個(gè)是修改后的記錄值,。當(dāng)然如果一段時(shí)間之類(lèi)數(shù)據(jù)庫(kù)僅僅只用于查詢(xún),沒(méi)有修改操作,,則不會(huì)產(chǎn)生日志信息,。日志文件是與數(shù)據(jù)庫(kù)備份恢復(fù)有著最直接關(guān)系的文件,有時(shí)候其作用甚至比數(shù)據(jù)文件更加重要,。日志文件的作用主要體現(xiàn)在數(shù)據(jù)庫(kù)出現(xiàn)故障的時(shí)候,,當(dāng)實(shí)例或介質(zhì)失敗時(shí)使用,。如果關(guān)掉數(shù)據(jù)庫(kù)所在機(jī)器的電源,,造成數(shù)據(jù)庫(kù)實(shí)例失敗,Oracle 將使用聯(lián)機(jī)重做日志,,以將數(shù)據(jù)庫(kù)系統(tǒng)恢復(fù)到電源停止之前的那一剎那,。如果包含數(shù)據(jù)文件的磁盤(pán)驅(qū)動(dòng)器發(fā)生永久性故障,Oracle將使用歸檔的重做日志,,與使用聯(lián)機(jī)重做日志一樣,,將驅(qū)動(dòng)器的備份及時(shí)恢復(fù)到故障發(fā)生前的那一個(gè)時(shí)間點(diǎn)。例如,,如果意外地丟失了一個(gè)表,,或刪除了一些關(guān)鍵的信息,并提交了操作,,可以通過(guò)這些聯(lián)機(jī)和備份的重做日志來(lái)進(jìn)行恢復(fù),,并使Oracle立即將它恢復(fù)到事故發(fā)生前的時(shí)刻。 有兩種類(lèi)型的重做日志文件,,它們是聯(lián)機(jī)日志文件的和歸檔日志文件,。每個(gè)Oracle數(shù)據(jù)庫(kù)至少有兩個(gè)聯(lián)機(jī)日志文件,這些聯(lián)機(jī)重做日志文件在大小上是固定的,,并以循環(huán)的方式使用,。第一個(gè)日志文件被填滿(mǎn)后,寫(xiě)入第二個(gè)日志文件,,然后依此類(lèi)推,。當(dāng)所有聯(lián)機(jī)日志文件都被填滿(mǎn)時(shí),就又回到第一個(gè)日志文件,,用新事務(wù)的數(shù)據(jù)對(duì)其進(jìn)行重寫(xiě),。從一個(gè)日志文件切換到另一個(gè)日志文件的動(dòng)作叫做日志切換。如果數(shù)據(jù)庫(kù)正以歸檔模式運(yùn)行,,在發(fā)生日志切換重寫(xiě)聯(lián)機(jī)日志文件前,,數(shù)據(jù)庫(kù)ARCH(歸檔進(jìn)程)將先對(duì)其進(jìn)行備份(即歸檔),,由此就產(chǎn)生了歸檔日志文件。如果數(shù)據(jù)庫(kù)運(yùn)行在非歸檔模式,,舊的日志文件將直接被新的日志文件所覆蓋,,不會(huì)產(chǎn)生歸檔日志。 2 Oracle的運(yùn)行方式 Oracle數(shù)據(jù)庫(kù)有兩種運(yùn)行方式,,一種是非歸檔方式,,一種是歸檔方式。 2.1 非歸檔方式 非歸檔方式就是Oracle在運(yùn)行中循環(huán)使用日志并在發(fā)生日志切換時(shí)日志信息被直接覆蓋而不歸檔的一種數(shù)據(jù)庫(kù)運(yùn)行方式,。Oracle數(shù)據(jù)庫(kù)運(yùn)行在非歸檔方式中時(shí),,日志文件將被循環(huán)利用,發(fā)生日志切換時(shí),,日志信息將被直接覆蓋,。一旦日志信息被覆蓋,則數(shù)據(jù)庫(kù)只能恢復(fù)到上次完全備份狀態(tài),。非歸檔方式是一種不安全的運(yùn)行方式,,而且在這種模式下不能進(jìn)行聯(lián)機(jī)備份也不能進(jìn)行部分?jǐn)?shù)據(jù)庫(kù)備份。每次備份時(shí),,只能關(guān)閉數(shù)據(jù)庫(kù),,備份完整的數(shù)據(jù)文件、日志文件和控制文件,。而每次恢復(fù)時(shí),,只能從失效前的一個(gè)完整的數(shù)據(jù)庫(kù)備份中恢復(fù)數(shù)據(jù)文件、日志文件和控制文件,。 在非歸檔方式下運(yùn)行的數(shù)據(jù)庫(kù),,只有歷史日志,沒(méi)有歸檔日志,。歸檔日志表示在日志切換之前寫(xiě)到備份介質(zhì)上的日志,,用于數(shù)據(jù)庫(kù)恢復(fù)。歷史日志表示在日志切換之后被覆蓋掉的日志,,只是一種標(biāo)識(shí),,表示何時(shí)產(chǎn)生過(guò)日志,物理上沒(méi)有日志數(shù)據(jù),,所以歷史日志由兩部分組成,,一部分是歸檔日志,另一部分是被覆蓋的日志,。 2.2 歸檔方式 歸檔方式就是Oracle在運(yùn)行中循環(huán)使用日志并在發(fā)生日志切換時(shí)日志信息先歸檔再覆蓋的一種數(shù)據(jù)庫(kù)運(yùn)行方式,。Oracle數(shù)據(jù)庫(kù)運(yùn)行在歸檔方式時(shí),只有當(dāng)檢驗(yàn)點(diǎn)發(fā)生時(shí)日志文件才會(huì)被重用,而此時(shí)日志文件中的信息已經(jīng)被歸檔進(jìn)程ARCH寫(xiě)到了備份介質(zhì)服務(wù)器上成為歸檔日志,。當(dāng)發(fā)生介質(zhì)故障時(shí),,可以使用歸檔日志文件進(jìn)行數(shù)據(jù)庫(kù)恢復(fù),可以保證不丟失任何已提交的數(shù)據(jù),,因此數(shù)據(jù)庫(kù)可以進(jìn)行聯(lián)機(jī)熱備份也可以進(jìn)行部分?jǐn)?shù)據(jù)庫(kù)備份,。 前面講到過(guò),每一個(gè)數(shù)據(jù)庫(kù)實(shí)例至少包含兩個(gè)日志文件組,,Oracle的后臺(tái)進(jìn)程LGWR時(shí)時(shí)監(jiān)控著日志文件的使用情況,,當(dāng)一個(gè)在線(xiàn)日志文件組被填滿(mǎn)后,就發(fā)生日志切換,,形成數(shù)據(jù)庫(kù)的歸檔日志文件,,這時(shí)LGWR進(jìn)程開(kāi)始將日志信息寫(xiě)到下一個(gè)在線(xiàn)日志文件組,當(dāng)最后一個(gè)可用的在線(xiàn)日志文件的檢驗(yàn)點(diǎn)到來(lái)時(shí),,即又回到第一個(gè)組,,如此循環(huán)。 數(shù)據(jù)庫(kù)運(yùn)行在非歸檔方式下時(shí),,在數(shù)據(jù)庫(kù)控制文件指明填滿(mǎn)的組不需要?dú)w檔,,所以當(dāng)填滿(mǎn)的組成為活動(dòng)組,在日志切換的檢驗(yàn)點(diǎn)完成時(shí),,則該組即可被LGWR重用。數(shù)據(jù)庫(kù)在這種方式下,,只能利用存儲(chǔ)在在線(xiàn)日志中的信息對(duì)數(shù)據(jù)庫(kù)實(shí)例故障進(jìn)行恢復(fù),,不能進(jìn)行介質(zhì)恢復(fù);如果運(yùn)行在歸檔方式下,,可實(shí)施在線(xiàn)日志的歸檔,,在控制文件中指明填滿(mǎn)的日志文件組在歸檔之前不能重用,一旦該組變?yōu)椴换顒?dòng)組,,則歸檔進(jìn)程立即可使用該組,。利用歸檔日志在數(shù)據(jù)庫(kù)出現(xiàn)故障時(shí)進(jìn)行介質(zhì)恢復(fù)。 值得一提的是,,Oracle數(shù)據(jù)庫(kù)默認(rèn)是工作在非歸檔模式下面的,。要將其改變到歸檔模式下,需要在數(shù)據(jù)庫(kù)正常運(yùn)行的情況下執(zhí)行下列操作: SQL > shutdown immediate; SQL > startup mount; SQL > alter database archivelog; SQL > alter database open; 每一步操作都成功后,,執(zhí)行SQL 語(yǔ)句“archive log list;”就可以看到數(shù)據(jù)庫(kù)的運(yùn)行模式已經(jīng)是歸檔模式了,。 3 檢驗(yàn)點(diǎn) 檢驗(yàn)點(diǎn)(CheckPoint,簡(jiǎn)寫(xiě)為CKPT)是Oracle的一個(gè)后臺(tái)進(jìn)程,,用來(lái)保證所有修改過(guò)的數(shù)據(jù)庫(kù)緩沖區(qū)中的內(nèi)容都被寫(xiě)入到數(shù)據(jù)庫(kù)文件中去,。在給定的時(shí)間內(nèi),數(shù)據(jù)庫(kù)文件出現(xiàn)“當(dāng)前”標(biāo)記并將檢驗(yàn)點(diǎn)記錄在控制文件中,,數(shù)據(jù)庫(kù)恢復(fù)時(shí)只需要提供從上一個(gè)檢驗(yàn)點(diǎn)以來(lái)的修改,。在保證信息已被寫(xiě)入到相應(yīng)的數(shù)據(jù)文件后,,允許重用一個(gè)日志文件。檢驗(yàn)點(diǎn)完成后,,系統(tǒng)將更新數(shù)據(jù)庫(kù)頭和控制文件,,以保證數(shù)據(jù)庫(kù)的同步。增加檢驗(yàn)點(diǎn)次數(shù)可以減少例程失敗時(shí)恢復(fù)所需的時(shí)間,。也就是說(shuō),,檢驗(yàn)點(diǎn)就是Oracle用來(lái)對(duì)所有數(shù)據(jù)庫(kù)文件進(jìn)行數(shù)據(jù)同步的一個(gè)措施。 這里介紹一個(gè)概念,,叫系統(tǒng)改變號(hào)SCN(System Change Number,,也叫檢驗(yàn)點(diǎn)號(hào),同步號(hào)等),。在Oracle系統(tǒng)中,,SCN是數(shù)據(jù)庫(kù)的三類(lèi)文件(控制文件、數(shù)據(jù)文件,、日志文件)的同步依據(jù),,同時(shí)存儲(chǔ)在這三類(lèi)文件當(dāng)中。在日志切換或其它原因引起系統(tǒng)改變時(shí),,檢驗(yàn)點(diǎn)號(hào)就會(huì)同時(shí)改變,。數(shù)據(jù)庫(kù)頭的同步號(hào)與日志文件、數(shù)據(jù)文件中的檢驗(yàn)點(diǎn)號(hào)完全相同則說(shuō)明數(shù)據(jù)庫(kù)中沒(méi)有不同步現(xiàn)象,,數(shù)據(jù)庫(kù)可以正常啟動(dòng),;否則數(shù)據(jù)庫(kù)存在不同步現(xiàn)象,數(shù)據(jù)庫(kù)不能正常啟動(dòng),,必須進(jìn)行介質(zhì)恢復(fù),。 SCN號(hào)在數(shù)據(jù)庫(kù)運(yùn)行中會(huì)實(shí)時(shí)改變,并同時(shí)將改變結(jié)果寫(xiě)入數(shù)據(jù)文件,、控制文件和數(shù)據(jù)庫(kù)頭,,以保證全部的數(shù)據(jù)庫(kù)文件同步。一般而言,,出現(xiàn)下列情況時(shí)會(huì)產(chǎn)生檢驗(yàn)點(diǎn),,SCN號(hào)會(huì)立即改變,生成一個(gè)新的檢驗(yàn)點(diǎn)號(hào): (1). 系統(tǒng)正常退出時(shí),。 (2). 系統(tǒng)產(chǎn)生日志文件切換時(shí),。 (3). 缺省設(shè)置的時(shí)間間隔到來(lái)時(shí)。 (4). 系統(tǒng)接收到執(zhí)行檢查點(diǎn)的命令時(shí),。如執(zhí)行SQL語(yǔ)句 “alter system checkpoint local;” 會(huì)在實(shí)例中顯式觸發(fā)一個(gè)檢驗(yàn)點(diǎn),。 (5). 系統(tǒng)緩沖區(qū)內(nèi)更新塊數(shù)達(dá)到指定長(zhǎng)度時(shí)。 (6). 最近一次檢驗(yàn)點(diǎn)到當(dāng)前 REDO日志塊之間的 REDO塊數(shù)達(dá)到指定的數(shù)量時(shí)。 檢驗(yàn)點(diǎn)有三類(lèi),,分別是局部檢驗(yàn)點(diǎn),、全局檢驗(yàn)點(diǎn)和文件檢驗(yàn)點(diǎn)。局部檢驗(yàn)點(diǎn)又稱(chēng)線(xiàn)程檢驗(yàn)點(diǎn),,即一個(gè)實(shí)例對(duì)數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)庫(kù)文件執(zhí)行一個(gè)檢驗(yàn)點(diǎn)操作,,即屬于一個(gè)實(shí)例的全部臟緩沖區(qū)都被寫(xiě)入到所有的數(shù)據(jù)文件中,如上述SQL語(yǔ)句“alter system checkpoint local;”執(zhí)行的就是一個(gè)局部檢驗(yàn)點(diǎn)操作,。而全局檢驗(yàn)點(diǎn)又稱(chēng)做數(shù)據(jù)庫(kù)檢驗(yàn)點(diǎn),,即所有實(shí)例對(duì)所有的數(shù)據(jù)文件執(zhí)行一個(gè)檢驗(yàn)點(diǎn)操作,即所有實(shí)例的全部臟緩沖區(qū)都被寫(xiě)入到所有的數(shù)據(jù)文件中,,如SQL語(yǔ)句“alter system checkpoint global;”執(zhí)行的就是一個(gè)全局檢驗(yàn)點(diǎn)操作,。而文件檢驗(yàn)點(diǎn),是所有實(shí)例對(duì)某一些數(shù)據(jù)文件所做的檢驗(yàn)點(diǎn)操作,,如后面會(huì)提到的SQL語(yǔ)句“alter tablespace system begin backup;”將執(zhí)行system表空間所屬全部數(shù)據(jù)文件的一個(gè)文件檢驗(yàn)點(diǎn)操作,。 4 回滾段 回滾段(Rollback Segement)是在當(dāng)事務(wù)修改某個(gè)數(shù)據(jù)塊時(shí)用于存放數(shù)據(jù)以前映像信息的數(shù)據(jù)庫(kù)段(存放數(shù)據(jù)修改之前的值和位置)?;貪L段的頭部包含正在使用的該回滾段事務(wù)的信息,。當(dāng)某事務(wù)修改一個(gè)數(shù)據(jù)塊時(shí),它更新數(shù)據(jù)塊頭,,讓數(shù)據(jù)塊頭指向包含該事務(wù)回滾信息的回滾段,。該事務(wù)還在回滾段的事務(wù)表中插入一項(xiàng),給出被修改數(shù)據(jù)塊的地址,、事務(wù)狀態(tài)以及回滾段中存放該事務(wù)回滾信息的位置,。一個(gè)事務(wù)只能使用一個(gè)回滾段來(lái)存放它的回滾信息,而一個(gè)回滾段可以存放多個(gè)事務(wù)的回滾信息,。 回滾段中的信息是用來(lái)保持?jǐn)?shù)據(jù)的讀一致性,并且用于事務(wù)回滾和事務(wù)恢復(fù),。例如: (1). 用于讀一致性:當(dāng)一個(gè)會(huì)話(huà)正在修改數(shù)據(jù)時(shí),,其它的會(huì)話(huà)將看不到該會(huì)話(huà)未提交的修改(會(huì)話(huà)級(jí)讀一致性)。而且,,當(dāng)一個(gè)語(yǔ)句正在執(zhí)行時(shí),,該語(yǔ)句將看不到從該語(yǔ)句開(kāi)始執(zhí)行后的未提交的修改(語(yǔ)句級(jí)讀一致性)。如當(dāng)Oracle執(zhí)行一條查詢(xún)語(yǔ)句時(shí),,Oracle會(huì)依照當(dāng)前的系統(tǒng)改變號(hào)來(lái)保證任何前于當(dāng)前系統(tǒng)改變號(hào)的未提交的改變都不被該語(yǔ)句處理,,當(dāng)其它會(huì)話(huà)或語(yǔ)句改變了該查詢(xún)所要查詢(xún)的那個(gè)數(shù)據(jù)塊,Oracle將利用回滾段的數(shù)據(jù)前影像來(lái)構(gòu)造一個(gè)讀一致性視圖,。 (2). 用于事務(wù)回滾:Oracle將會(huì)利用回滾段中的數(shù)據(jù)前影像來(lái)將修改的數(shù)據(jù)恢復(fù)到原來(lái)的值,。如事務(wù)將某一個(gè)數(shù)據(jù)塊中的一個(gè)值從100修改為1000,則原值100要存在回滾段中,而數(shù)據(jù)塊中存儲(chǔ)新值1000,。如果現(xiàn)在發(fā)現(xiàn)修改有問(wèn)題,,需要回滾,則原值100將從回滾段中拷貝回?cái)?shù)據(jù)塊中,。 (3). 用于事務(wù)恢復(fù):當(dāng)事務(wù)正在處理的時(shí)候發(fā)生例程失敗,,如Oracle某個(gè)后臺(tái)進(jìn)程異常終止,則必須關(guān)閉并重啟Oracle,?;貪L段的信息保存在重做日志文件中,在啟動(dòng)過(guò)程中,,Oracle將自動(dòng)進(jìn)行事務(wù)恢復(fù)實(shí)現(xiàn)向前回滾,,來(lái)恢復(fù)未提交的數(shù)據(jù)?;貪L段和REDO日志一起保障了事務(wù)的完整性,。 回滾段分為系統(tǒng)回滾段、非系統(tǒng)回滾段以及Defered回滾段,。系統(tǒng)回滾段是在數(shù)據(jù)庫(kù)創(chuàng)建后由系統(tǒng)自動(dòng)創(chuàng)建的,,該回滾段只用于存放系統(tǒng)表空間中對(duì)象的前影像。非系統(tǒng)回滾段用于存放非系統(tǒng)表空間中對(duì)象的數(shù)據(jù)前影像,。非系統(tǒng)回滾段又分為私有回滾段和公有回滾段,,私有回滾段應(yīng)在參數(shù)文件的Rollback Segements參數(shù)中列出,以便例程啟動(dòng)時(shí)自動(dòng)使其在線(xiàn),。公有回滾段一般在OPS(Oracle并行服務(wù)器)中出現(xiàn),,將在例程啟動(dòng)時(shí)自動(dòng)在線(xiàn)。 Defered回滾段在表空間離線(xiàn)(Offline)時(shí)由系統(tǒng)自動(dòng)創(chuàng)建,,當(dāng)表空間再次在線(xiàn)(Online)時(shí)由系統(tǒng)自動(dòng)刪除,,用于存放表空間離線(xiàn)時(shí)產(chǎn)生的回滾信息。 5 Oracle備份恢復(fù)原理分析 Oracle 數(shù)據(jù)庫(kù)使用數(shù)據(jù)庫(kù)后備副本,、日志,、回滾段和控制文件這幾種結(jié)構(gòu)來(lái)保護(hù)數(shù)據(jù)。它采用日志文件及回滾段的形式保存日志信息,。當(dāng)某事務(wù)修改一個(gè)數(shù)據(jù)塊時(shí),,修改前的數(shù)據(jù)信息(稱(chēng)為前映像)被存儲(chǔ)到回滾段中。由于事務(wù)內(nèi)部故障出現(xiàn)的概率大于其它類(lèi)型故障,,把回滾信息存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi)部的對(duì)象(回滾段)中而不是寫(xiě)在日志文件中可以明顯地提高故障恢復(fù)的效率(有點(diǎn)類(lèi)似于CPU的Cache的作用),。事務(wù)提交前都會(huì)將相應(yīng)的日志信息寫(xiě)盤(pán),這確保了日志信息是完整的,。為了提高效率,,在事務(wù)提交之后并不馬上將提交的數(shù)據(jù)寫(xiě)盤(pán)(Cache也是這樣做的),。 我們注意到當(dāng)我們采取熱備份的時(shí)候,需要對(duì)每個(gè)要備份的表空間置為backup模式,。通常的熱備份的腳本都是這樣的: alter tablespace system begin backup ,; cp e:\oracle9i\oradata\oemrep\system01.backup to e: \system01.backup ; alter tablespace users end backup ,; 我們知道,,Oracle的最小存儲(chǔ)單位是一個(gè)數(shù)據(jù)塊,一個(gè)塊的大小通常設(shè)置為8k,,而操作系統(tǒng)的塊通常是512字節(jié),,這說(shuō)明一個(gè)Oracle的數(shù)據(jù)塊由很多個(gè)操作系統(tǒng)的塊組成。而且對(duì)于一個(gè)數(shù)據(jù)文件來(lái)說(shuō),,它的所有塊對(duì)應(yīng)的操作系統(tǒng)的塊并不是按順序存儲(chǔ)的,,當(dāng)運(yùn)行cp等操作系統(tǒng)命令時(shí)并不能指定從Oracle的哪個(gè)數(shù)據(jù)塊開(kāi)始拷貝。當(dāng)open數(shù)據(jù)庫(kù)的時(shí)候,,Oracle會(huì)去比較控制文件中數(shù)據(jù)文件記錄和數(shù)據(jù)文件頭的checkpoint cnt,,如果兩者相同,則判斷數(shù)據(jù)庫(kù)是同步的,,不需要介質(zhì)恢復(fù),,如果不同,Oracle就會(huì)報(bào)錯(cuò),,提示某某文件需要進(jìn)行介質(zhì)恢復(fù),。然后我們必須拷貝回?cái)?shù)據(jù)文件的備份,開(kāi)始做recover,,這時(shí)候數(shù)據(jù)庫(kù)就會(huì)從上次成功備份時(shí)的SCN開(kāi)始恢復(fù),,選定恢復(fù)時(shí)使用的日志,直到恢復(fù)結(jié)束,。如果我們沒(méi)有執(zhí)行SQL語(yǔ)句alter tablespace system begin backup 的話(huà),,當(dāng)拷貝數(shù)據(jù)文件時(shí),比如說(shuō)我們拷貝的第一個(gè)塊可能是SCN為100的數(shù)據(jù)塊,。我們知道當(dāng)數(shù)據(jù)庫(kù)發(fā)生檢驗(yàn)點(diǎn)時(shí)會(huì)去更新數(shù)據(jù)文件頭和控制文件中的checkpoint scn,,如果當(dāng)我們?cè)诳截悢?shù)據(jù)文件的同時(shí)發(fā)生了幾次檢驗(yàn)點(diǎn),這時(shí)候數(shù)據(jù)文件頭的SCN可能被更新了很多次,。這時(shí)候拷貝進(jìn)程去拷貝數(shù)據(jù)文件頭所在的操作系統(tǒng)塊,可能這個(gè)數(shù)據(jù)文件頭的塊因?yàn)楸籧heckpoint了很多次導(dǎo)致它的SCN為1000,,這時(shí)候整個(gè)數(shù)據(jù)文件會(huì)出現(xiàn)不一致,,當(dāng)用這個(gè)備份文件去恢復(fù)數(shù)據(jù)庫(kù)時(shí),恢復(fù)進(jìn)程會(huì)從SCN=1000開(kāi)始恢復(fù),,這樣的話(huà)恢復(fù)的數(shù)據(jù)庫(kù)就會(huì)丟失從SCN號(hào)100到1000的那些數(shù)據(jù)塊,,因?yàn)榛謴?fù)進(jìn)程并不應(yīng)用SCN在1000以前的日志,,所以不置成backup模式備份的話(huà)是不可取的。當(dāng)數(shù)據(jù)文件置于backup模式時(shí),,Oracle會(huì)去鎖定數(shù)據(jù)文件頭,,這時(shí)候數(shù)據(jù)庫(kù)發(fā)生檢驗(yàn)點(diǎn)的話(huà)將不會(huì)修改文件頭的SCN,而只是增加checkpoint cnt,,所以不管執(zhí)行拷貝的時(shí)候操作系統(tǒng)塊的拷貝順序是如何,,Oracle總會(huì)從文件頭的SCN開(kāi)始恢復(fù),這樣的話(huà)也就避免了前面提到的恢復(fù)時(shí)的數(shù)據(jù)塊丟失,。當(dāng)然如果大家用的是Rman來(lái)備份的話(huà),,就不會(huì)有這個(gè)問(wèn)題,因?yàn)镽man備份的時(shí)候會(huì)自動(dòng)對(duì)比數(shù)據(jù)塊的頭尾標(biāo)志,,如果發(fā)現(xiàn)不一致,,那么它將會(huì)再去讀這個(gè)塊,直到讀到一致的塊才往備份集里寫(xiě),。 |
|