尹秀梅
數(shù)據(jù)庫管理系統(tǒng)中包含一個很重要的部分——數(shù)據(jù)庫恢復(fù)。在計算機的世界里,存在著各種隱患和威脅,系統(tǒng)的故障、操作員的失誤、故意的破壞以及硬件故障都有可能會造成數(shù)據(jù)庫不能正常運轉(zhuǎn)。在這種不可避免的現(xiàn)實情況下,我們能做的就是采用一種技術(shù)來挽救遭到破壞的數(shù)據(jù)庫,使其繼續(xù)按照正常的方式運轉(zhuǎn),本文針對數(shù)據(jù)庫故障的幾種類型和相對應(yīng)的措施進行探索。
在我們正確建立了數(shù)據(jù)庫后,盡管數(shù)據(jù)庫系統(tǒng)中采用了各種保護措施來保證數(shù)據(jù)庫的安全性和完整性,保證并發(fā)事物的正確執(zhí)行,因為計算機系統(tǒng)中硬件的故障、軟件的錯誤、操作員的失誤以及惡意的破壞是不可避免的,這些故障輕則造成運行事務(wù)非正常中斷,影響數(shù)據(jù)庫中數(shù)據(jù)的正確性,重則破壞數(shù)據(jù)庫,使數(shù)據(jù)庫中全部或部分數(shù)據(jù)丟失,因此必須要有恢復(fù)子系統(tǒng)。
在研究數(shù)據(jù)庫恢復(fù)技術(shù)之前,我們首先要對數(shù)據(jù)庫發(fā)生故障的類型進行了解,從而對癥下藥。
事務(wù)是用戶定義的一個數(shù)據(jù)庫操作序列,這些操作要么都做要么都不做,是一個不可分割的工作單位,是數(shù)據(jù)庫應(yīng)用程序的基本邏輯單元。
事務(wù)故障就是事務(wù)沒有達到預(yù)先期望的終點,并且使數(shù)據(jù)庫進入不正確的狀態(tài),這時恢復(fù)程序應(yīng)該首先保證不影響其他事務(wù)運行,然后再強行回滾這個事務(wù),撤銷這個事務(wù)對數(shù)據(jù)庫已經(jīng)進行的修改。
恢復(fù)子系統(tǒng)應(yīng)該在系統(tǒng)重新啟動時讓所有非正常終止的事務(wù)回滾,強行撤銷所有未完成的事務(wù)。
介質(zhì)故障,主要指外存故障,雖然其發(fā)生的幾率比前面兩種小,但是一旦發(fā)生,破壞性是最大的。因此我們?yōu)榱丝梢栽诎l(fā)生如此重大故障的時候,不至于手忙腳亂或者丟失我們的重要數(shù)據(jù),也已經(jīng)找到了應(yīng)對這種故障的恢復(fù)技術(shù)。
計算機病毒就是一些走入歧途的計算機工作者編制的計算機程序,不但會侵入別人的計算機,而且會在網(wǎng)絡(luò)間快速蔓延,導(dǎo)致計算機陷入癱瘓或者遭到破壞,從而會導(dǎo)致數(shù)據(jù)丟失。但是它和其他的計算機程序不同之處在于它可以以很快的速度進行傳播和繁殖,從而對計算機系統(tǒng)造成破壞,進而也就對數(shù)據(jù)庫造成了破壞。雖然有很多殺毒軟件,但是沒有一款殺毒軟件可以保證完全防御計算機病毒的入侵。因此我們需要一種穩(wěn)定的數(shù)據(jù)庫恢復(fù)技術(shù)來確保當計算機病毒對計算機造成侵害時,可以有效防止最壞的情況出現(xiàn),也就是數(shù)據(jù)遭到破壞或者完全丟失。
掌握數(shù)據(jù)庫恢復(fù),最重要的就是掌握兩個方面。
最常用的方法是登記日志文件和數(shù)據(jù)轉(zhuǎn)儲,大多數(shù)時候,這兩種方法要結(jié)合起來使用才能達到最好的效果。
數(shù)據(jù)轉(zhuǎn)儲
研究數(shù)據(jù)庫恢復(fù),首當其沖的當然是了解其最基本的技術(shù),即數(shù)據(jù)轉(zhuǎn)儲。
數(shù)據(jù)轉(zhuǎn)儲按照不同的分類方法大致有兩種分法。一是可以分為海量轉(zhuǎn)儲和增量轉(zhuǎn)儲,二是可以分為動態(tài)轉(zhuǎn)儲和靜態(tài)轉(zhuǎn)儲。當數(shù)據(jù)庫非常大的時候,如果每次都轉(zhuǎn)儲全部數(shù)據(jù)庫,難免會使得效率降低,因此使用增量轉(zhuǎn)儲較好。
雖然轉(zhuǎn)儲和用戶事務(wù)實現(xiàn)了并行運行,但是在轉(zhuǎn)儲過程中,用戶更新了數(shù)據(jù)庫,并不會再對更新過的數(shù)據(jù)轉(zhuǎn)儲,此時難免會造成錯誤。
靜態(tài)轉(zhuǎn)儲是指在數(shù)據(jù)庫系統(tǒng)中沒有運行的事務(wù)時進行的操作,它要求在此期間不允許對數(shù)據(jù)庫進行增刪改查操作。和動態(tài)轉(zhuǎn)儲相比較,它雖然更為簡單易行,但轉(zhuǎn)儲操作必須等正在運行的事務(wù)結(jié)束后才可以進行,新的事務(wù)也必須等轉(zhuǎn)儲結(jié)束后才可以進行,因此會大大降低數(shù)據(jù)庫的運行效率。
因此,我們需要采用另一種辦法,即把轉(zhuǎn)儲期間每個事務(wù)對數(shù)據(jù)庫的修改記錄下來,建立為日志文件,日志文件和后備副本結(jié)合使用就可以把數(shù)據(jù)庫恢復(fù)到之前某一個時刻的正確的時候了。
登記日志文件
日志文件是用來記錄事務(wù)對數(shù)據(jù)庫更新操作的文件。我們說過,數(shù)據(jù)庫恢復(fù)通常是采用數(shù)據(jù)轉(zhuǎn)儲和登記日志文件結(jié)合使用才能達到效果,那么什么情況下使用日志文件呢?
事務(wù)故障恢復(fù)和系統(tǒng)故障恢復(fù)以及動態(tài)轉(zhuǎn)儲都必須要用到日志文件,想有效地恢復(fù)數(shù)據(jù)庫,就要將數(shù)據(jù)轉(zhuǎn)儲得到的后備副本和日志文件結(jié)合起來。
由于搜索檢查所有日志記錄耗費大量的時間,并且很多需要REDO 處理的事務(wù)已經(jīng)將它們的更新操作記入到數(shù)據(jù)庫中了,而恢復(fù)子系統(tǒng)又執(zhí)行了這些操作,浪費大量人力物力。因此,在科技不斷發(fā)展的過程中,又出現(xiàn)了一種更為完善的恢復(fù)技術(shù),即具有檢查點的恢復(fù)技術(shù),這種技術(shù)是在日志文件中增加一個檢查點記錄,一個重新開始文件,從而達到讓恢復(fù)子系統(tǒng)可以在登錄日志文件期間可以動態(tài)的維護日志。
恢復(fù)的步驟:
首先,從終止點向前依次掃描日志文件,查找這個事務(wù)進行過的所有更新操作;
其次,把日志記錄中更新前的值寫入數(shù)據(jù)庫。這樣,如果記錄中是插入操作,就相當于在做刪除操作;同樣,如果是在做刪除操作,那么就相當于在做插入操作;如果是在做修改操作,就相當于用修改前的值代替修改后的值,等等;
然后,繼續(xù)重復(fù)開始的操作,查找到該事務(wù)的其他更新操作,并進行同第二步相同的操作;
最后,重復(fù)上述所有操作,一直到讀取到該事務(wù)的開始標記為止,此時事務(wù)故障恢復(fù)就算完成了。
系統(tǒng)故障之所以會使數(shù)據(jù)庫破壞或者丟失,究其原因主要是把沒完成的事務(wù)對數(shù)據(jù)庫的更新也寫入了數(shù)據(jù)庫;那么應(yīng)該如何進行系統(tǒng)故障恢復(fù)呢,我們給出下面的恢復(fù)步驟:
首先,先從頭掃描日志文件,找到故障發(fā)生之前已經(jīng)提交了的事務(wù)和故障發(fā)生的時候還沒完成的事務(wù),將前者的事務(wù)標記記入REDO 隊列,后者的事務(wù)標記記入撤銷隊列。然后,我們對撤銷隊列中的每個事物進行UNDO 處理。最后,對REDO 序列中的每個事務(wù)進行REDO 處理。
介質(zhì)故障是存儲在磁盤上的日志文件和物理數(shù)據(jù)遭到破壞,這種故障是最嚴重的,其恢復(fù)的方法就是重裝數(shù)據(jù)庫,然后重做已經(jīng)完成的事務(wù)。
首先,載入轉(zhuǎn)儲結(jié)束的時候的日志文件,然后把已經(jīng)完成了的事務(wù)重新做一遍。
要注意的是,此類故障需要數(shù)據(jù)庫管理員的介入。
隨著科技的發(fā)展,時代的進步,磁盤容量越來越大,價格也越來越便宜,所以為了避免介質(zhì)故障這種最為嚴重的故障出現(xiàn),許多的DBMS 提供了數(shù)據(jù)庫鏡像功能用于數(shù)據(jù)庫恢復(fù)。
本文分析了數(shù)據(jù)庫恢復(fù)系統(tǒng)存在的必要性、作用以及實現(xiàn)方式,闡述了幾種常見的故障會帶給數(shù)據(jù)庫系統(tǒng)的嚴重的危害。并提出了對應(yīng)于這些故障的恢復(fù)技術(shù),使得我們不會無從應(yīng)對,不會使我們重要的數(shù)據(jù)庫文件缺失或者損壞。未來我們將根據(jù)反饋情況,在相關(guān)問題上繼續(xù)深入探索,從而進一步完善數(shù)據(jù)庫恢復(fù)技術(shù)。