李永亮++鄭晨溪
摘要:本文通過(guò)對(duì)Oracle數(shù)據(jù)庫(kù)物理結(jié)構(gòu)和重做日志的分析,指出了重做日志是數(shù)據(jù)恢復(fù)的關(guān)鍵,進(jìn)而介紹了數(shù)據(jù)恢復(fù)的原理,更能凸顯重做日志在數(shù)據(jù)恢復(fù)中的核心地位。了解重做日志原理和數(shù)據(jù)恢復(fù)的過(guò)程對(duì)日常維護(hù)工作中出現(xiàn)的各種Oracle數(shù)據(jù)恢復(fù)情景都有重要的指導(dǎo)意義。隨著數(shù)據(jù)庫(kù)技術(shù)的高速發(fā)展,Oracle數(shù)據(jù)庫(kù)現(xiàn)已廣泛運(yùn)用于各企事業(yè)單位的信息化建設(shè),并逐步發(fā)展成為各單位信息化管理的重要基礎(chǔ),尤其一些核心業(yè)務(wù)數(shù)據(jù)保存在Oracle數(shù)據(jù)庫(kù)里,數(shù)據(jù)庫(kù)的數(shù)據(jù)安全顯得尤為重要。
關(guān)鍵詞:數(shù)據(jù)庫(kù) 數(shù)據(jù)恢復(fù) 重做日志 重做記錄
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2014)12-0202-01
一旦造成數(shù)據(jù)丟失,將會(huì)付出巨大的工作量去彌補(bǔ)數(shù)據(jù),也可能因此造成不可挽回的損失。因此對(duì)從事數(shù)據(jù)庫(kù)管理的DBA來(lái)說(shuō),做好數(shù)據(jù)的備份與恢復(fù)是一項(xiàng)很重要的工作,本文主要針對(duì)Oracle數(shù)據(jù)庫(kù)的恢復(fù)相關(guān)的技術(shù)進(jìn)行探討。
1 Oracle數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)
Oracle數(shù)據(jù)庫(kù)主要由參數(shù)文件、數(shù)據(jù)文件、重做日志文件和控制文件等組成。數(shù)據(jù)文件、重做日志文件和控制文件是最核心的文件,其中數(shù)據(jù)文件保證了數(shù)據(jù)庫(kù)數(shù)據(jù)的持久存在,保存了所有生成的數(shù)據(jù);重做日志文件保證了數(shù)據(jù)庫(kù)的可恢復(fù)性,保存數(shù)據(jù)文件、控制文件等各類文件一段時(shí)間以來(lái)的修改記錄;控制文件的作用主要是確定數(shù)據(jù)文件和重做日志文件的路徑、數(shù)據(jù)庫(kù)字符集、數(shù)據(jù)庫(kù)當(dāng)前狀態(tài)、檢查點(diǎn)信息、保存其它文件頭部的部分信息以便交叉校驗(yàn)及提供備份信息資料庫(kù)等。這三類文件是打開(kāi)數(shù)據(jù)庫(kù)所必需的,缺一不可,其中重做日志在備份恢復(fù)是最重要的。
2 重做日志的作用與原理
重做日志可分為在線重做日志和歸檔重做日志,在線重做日志是重做記錄在磁盤上的臨時(shí)保存地點(diǎn),它是數(shù)據(jù)庫(kù)完全恢復(fù)的關(guān)鍵;歸檔重做日志文件是對(duì)過(guò)去時(shí)間在線重做日志的永久保存。理論上只要數(shù)據(jù)庫(kù)的重做日志完整,數(shù)據(jù)庫(kù)就能被完全恢復(fù)。
重做日志文件保存的數(shù)據(jù)稱為重做記錄,是它使數(shù)據(jù)庫(kù)具備了恢復(fù)的能力。對(duì)數(shù)據(jù)庫(kù)做出的任何形式的更改,都會(huì)在真正執(zhí)行更改操作之前產(chǎn)生一條重做記錄,該記錄包含一個(gè)或多個(gè)操作,記載了數(shù)據(jù)庫(kù)如何從一個(gè)狀態(tài)改變到另一個(gè)狀態(tài)的具體步驟,其中包含對(duì)多個(gè)數(shù)據(jù)塊的修改,也可能包含對(duì)控制文件和其他文件的修改。
一個(gè)數(shù)據(jù)庫(kù)的狀態(tài)變更對(duì)應(yīng)一條重做記錄,重做記錄則包含一個(gè)或多個(gè)變更矢量,變更矢量記載了對(duì)一個(gè)數(shù)據(jù)塊的原子操作。
以一個(gè)update語(yǔ)句為例看一下重做記錄的各個(gè)變更矢量,正常情況update命令會(huì)產(chǎn)生一條包含4個(gè)變更矢量的重做記錄。首先是對(duì)撤銷數(shù)據(jù)修改的兩個(gè)變更矢量,然后是具體的update操作的數(shù)據(jù)塊的變更矢量,最后一個(gè)矢量是一個(gè)標(biāo)記,不修改任何對(duì)象。因此這條重做記錄包含了重做記錄頭部和4條變更矢量。
通過(guò)重做記錄可以看出數(shù)據(jù)文件的更新落后于在線日志文件的內(nèi)容,這個(gè)也是在數(shù)據(jù)完全恢復(fù)時(shí)為什么總是需要在線重做日志的原因,只有應(yīng)用在線重做日志才能保證數(shù)據(jù)不丟失。如果在線日志文件全部損壞的話,那就只能不完全恢復(fù)了。
3 數(shù)據(jù)恢復(fù)的原理
Oracle數(shù)據(jù)庫(kù)恢復(fù)一般分為兩類,實(shí)例恢復(fù)和介質(zhì)恢復(fù)。實(shí)例恢復(fù)主要是在數(shù)據(jù)庫(kù)啟動(dòng)過(guò)程中發(fā)現(xiàn)數(shù)據(jù)庫(kù)文件不同步,自動(dòng)利用在線日志中的重做記錄自動(dòng)對(duì)文件進(jìn)行恢復(fù)的過(guò)程。介質(zhì)恢復(fù)主要是在文件物理?yè)p壞的情況下,將數(shù)據(jù)庫(kù)還原和恢復(fù),最后使數(shù)據(jù)庫(kù)正常運(yùn)行的過(guò)程。因此實(shí)例恢復(fù)的前提是數(shù)據(jù)文件、控制文件和在線日志文件必須沒(méi)有損壞,其局限性也明顯,介質(zhì)恢復(fù)才是日常數(shù)據(jù)恢復(fù)的一種常見(jiàn)情況。不論哪類的恢復(fù)都需要重做日志的支持。
實(shí)例恢復(fù)一般指實(shí)例崩潰(斷電)或使用命令強(qiáng)制關(guān)閉數(shù)據(jù)庫(kù)時(shí)的一類恢復(fù),那時(shí)有一定的臟數(shù)據(jù)塊還在緩存里,事務(wù)可能有的已經(jīng)提交有的尚未提交,更嚴(yán)重的是,有的事務(wù)未提交,但它們的數(shù)據(jù)塊已經(jīng)被寫回到數(shù)據(jù)文件中,這樣數(shù)據(jù)庫(kù)事務(wù)的持久性和原子性都遭到破壞,因此實(shí)例恢復(fù)的第一步就是自動(dòng)前滾,只要將數(shù)據(jù)文件頭部的檢查點(diǎn)SCN(系統(tǒng)變更號(hào))和當(dāng)前在線日志文件中最新的重做記錄SCN比較,判斷數(shù)據(jù)文件是否同步,如果數(shù)據(jù)文件頭部SCN小于重做記錄SCN,則開(kāi)始前滾,前滾操作主要是從某一個(gè)檢查點(diǎn)開(kāi)始,逐條讀取在線重做日志里記錄的重做記錄,更新相應(yīng)的數(shù)據(jù)塊,直至用完在線日志的最后一條重做記錄。前滾只是解決了數(shù)據(jù)的持久性,對(duì)未提交的變更和提交的變更都依據(jù)在線重做日志恢復(fù)出來(lái)了,但是破壞了原子性,因此實(shí)例恢復(fù)的第二步需要對(duì)未提交的事務(wù)進(jìn)行回滾,這個(gè)是自動(dòng)進(jìn)行的。
介質(zhì)恢復(fù)主要因?yàn)閿?shù)據(jù)文件遭到了某種程度的破壞,因此第一步需要先將之前的備份復(fù)制到原來(lái)的位置,雖然備份的文件完整性沒(méi)問(wèn)題,但是頭部的檢查點(diǎn)SCN與在線日志的SCN不連續(xù),無(wú)法進(jìn)行實(shí)例恢復(fù),因此需要進(jìn)行手工恢復(fù),利用recover命令讀取歸檔日志和在線日志中的重做記錄,將變更重做,把數(shù)據(jù)文件中丟失的變更找回,使復(fù)制過(guò)來(lái)的數(shù)據(jù)文件和日志中的記錄變更一致,最后進(jìn)行自動(dòng)回滾。
4 結(jié)語(yǔ)
通過(guò)本文的介紹,可以看出重做日志文件在數(shù)據(jù)恢復(fù)中占有非常重要的地位。在實(shí)踐中,數(shù)據(jù)庫(kù)出現(xiàn)故障后的數(shù)據(jù)恢復(fù)是一項(xiàng)復(fù)雜的技術(shù)問(wèn)題。當(dāng)然不管是實(shí)例恢復(fù)還是介質(zhì)恢復(fù),都離不開(kāi)備份,面對(duì)各式各樣的數(shù)據(jù)庫(kù)恢復(fù)故障,只有理解了數(shù)據(jù)恢復(fù)的原理,才能分析出故障的原因并結(jié)合備份數(shù)據(jù),制定合適的恢復(fù)策略,保證數(shù)據(jù)庫(kù)應(yīng)用的正常恢復(fù)。
參考文獻(xiàn)
[1]徐吉,龔正良,萬(wàn)鋒,楊澤平.Oracle數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)方法的研究[J].計(jì)算機(jī)工程,2005,(13):75-76.
[2]包光磊.Oracle 11g數(shù)據(jù)庫(kù)恢復(fù)技術(shù)[M].北京:電子工業(yè)出版社,2012:10-16.
[3]余以勝.ORACLE數(shù)據(jù)庫(kù)備份解決方案的研究[J].計(jì)算機(jī)與數(shù)字工程,2006,(1):119.
[4]馮遵委,劉偉成,趙鼎鼎,史百戰(zhàn).Oracle數(shù)據(jù)庫(kù)備份和恢復(fù)的研究與應(yīng)用[J].計(jì)算機(jī)時(shí)代,2006,(7):58.
[5]李海波.Oracle數(shù)據(jù)庫(kù)的安全及備份恢復(fù)[J].電腦知識(shí)與技術(shù),2004,(11):14.endprint