張麗君
(河南科技學(xué)院,河南新鄉(xiāng)453003)
數(shù)據(jù)庫(kù)技術(shù)在各個(gè)行業(yè)和各個(gè)領(lǐng)域得到了廣泛的應(yīng)用,在對(duì)數(shù)據(jù)庫(kù)應(yīng)用的過(guò)程中,操作員的錯(cuò)誤操作、不知原因的惡意破壞、以及系統(tǒng)的不穩(wěn)定和物理介質(zhì)的損壞等等原因,都有可能造成重要數(shù)據(jù)的丟失.一旦數(shù)據(jù)在數(shù)據(jù)庫(kù)中發(fā)生了丟失或者數(shù)據(jù)遭到損壞,帶來(lái)的損失將是巨大的,所以對(duì)數(shù)據(jù)庫(kù)的恢復(fù)就非常的有必要.對(duì)于一些大型的和敏感的數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō),一般都會(huì)提前采取相應(yīng)的策略,以保證數(shù)據(jù)庫(kù)中即使有故障出現(xiàn),也能使數(shù)據(jù)庫(kù)得到恢復(fù),使得跟故障發(fā)生之前的數(shù)據(jù)庫(kù)是一致的[1].
在數(shù)據(jù)庫(kù)中,有一個(gè)非常重要的概念——事務(wù)(Transaction),它是數(shù)據(jù)庫(kù)恢復(fù)的基本單位.是用戶(hù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的一些列語(yǔ)句組合在一起形成的一個(gè)集合,這個(gè)集合是一個(gè)原子單位,不能再分.事務(wù)和程序是兩個(gè)概念,通常來(lái)說(shuō)在RDB中,在一個(gè)事務(wù)中通常包含的SQL語(yǔ)句,可以只有單純的一條,也可以有很多條,甚至還可以包含整個(gè)應(yīng)用程序.事務(wù)是數(shù)據(jù)庫(kù)恢復(fù)和并發(fā)控制的基本單位,事務(wù)具有4項(xiàng)基本特性[2],簡(jiǎn)稱(chēng)ACID特性.
我們都知道原子的一個(gè)非常重要的特性就是不可再分,而對(duì)于事務(wù)來(lái)說(shuō),它也是一個(gè)不可分割的整體工作單位,其中包括的所有操作都要滿(mǎn)足一個(gè)條件:操作要么從第一條開(kāi)始到最后一條都執(zhí)行完,要么所有的操作就一條都不執(zhí)行.
數(shù)據(jù)庫(kù)中的數(shù)據(jù)要保證其是正確的、有效的和相容的.在一個(gè)事務(wù)執(zhí)行的前后,必須要保證數(shù)據(jù)庫(kù)是從之前的一致性狀態(tài)轉(zhuǎn)換到另外一個(gè)一致性的狀態(tài).
對(duì)于串行執(zhí)行的事務(wù)而言,不涉及到互相干擾的問(wèn)題.但是為了提高系統(tǒng)的執(zhí)行效率,應(yīng)該采取并發(fā)執(zhí)行,但是要保證一個(gè)事務(wù)的執(zhí)行期間,其用到的數(shù)據(jù)不能被其他的事務(wù)所修改.如表1所示.表中的兩個(gè)事務(wù)執(zhí)行過(guò)程中就沒(méi)有遵守隔離性,從而導(dǎo)致T1對(duì)數(shù)據(jù)項(xiàng)X的修改丟失了.
表1 數(shù)據(jù)丟失修改Tab.1 The loss of data modification
事務(wù)的持續(xù)性是指一旦一個(gè)事務(wù)以COMMIT語(yǔ)句提交,那么不管數(shù)據(jù)庫(kù)發(fā)生什么故障,都不會(huì)對(duì)這個(gè)事務(wù)生成的結(jié)果有任何的影響,也就是說(shuō),事務(wù)對(duì)數(shù)據(jù)庫(kù)形成了永久性的改變.
數(shù)據(jù)庫(kù)運(yùn)行中,很難避免一些錯(cuò)誤的發(fā)生,也就是說(shuō),會(huì)有各種各樣的故障,主要有:事務(wù)內(nèi)部的故障、軟故障、硬故障和計(jì)算機(jī)病毒[3].如果數(shù)據(jù)庫(kù)系統(tǒng)在事務(wù)運(yùn)行時(shí)有故障發(fā)生了,那么數(shù)據(jù)庫(kù)恢復(fù)子系統(tǒng)將會(huì)把數(shù)據(jù)庫(kù)從錯(cuò)誤狀態(tài)恢復(fù)到故障發(fā)生之前的一個(gè)一致性的狀態(tài).在DBS中,數(shù)據(jù)庫(kù)恢復(fù)是非常重要的,故障隨時(shí)都有可能發(fā)生,所以在整個(gè)數(shù)據(jù)庫(kù)的運(yùn)行過(guò)程中恢復(fù)策略必不可少.對(duì)于恢復(fù)操作來(lái)說(shuō),基本的處理方法是利用備份的數(shù)據(jù)來(lái)進(jìn)行錯(cuò)誤恢復(fù),一個(gè)大型數(shù)據(jù)庫(kù)產(chǎn)品,在所有的數(shù)據(jù)庫(kù)代碼中,恢復(fù)子系統(tǒng)會(huì)占至少10%.如果要實(shí)現(xiàn)數(shù)據(jù)庫(kù)的恢復(fù),一般有兩個(gè)問(wèn)題需要解決:一是怎樣生成后備的數(shù)據(jù);二是如何利用這些數(shù)據(jù)副本對(duì)故障進(jìn)行恢復(fù).
最常用的建立冗余數(shù)據(jù)的方法有兩個(gè),一個(gè)是數(shù)據(jù)轉(zhuǎn)儲(chǔ),另一個(gè)是登錄日志文件.
由數(shù)據(jù)庫(kù)管理員(DBA)按照一定的周期,對(duì)整個(gè)數(shù)據(jù)庫(kù)進(jìn)行復(fù)制轉(zhuǎn)移,把整個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)移到其他的磁盤(pán)上,這個(gè)過(guò)程叫做數(shù)據(jù)轉(zhuǎn)儲(chǔ)[4].轉(zhuǎn)移到其他磁帶上或者磁盤(pán)上的數(shù)據(jù)叫做后備數(shù)據(jù).當(dāng)數(shù)據(jù)庫(kù)遭到破壞時(shí),DBA可以根據(jù)之前制作的后備副本對(duì)數(shù)據(jù)庫(kù)進(jìn)行恢復(fù).但是重裝后備副本只能將數(shù)據(jù)庫(kù)恢復(fù)到轉(zhuǎn)儲(chǔ)結(jié)束時(shí)那一個(gè)時(shí)刻的狀態(tài),如果故障是在轉(zhuǎn)儲(chǔ)結(jié)束時(shí)刻的后期發(fā)生,單純的只重裝后備副本是不行的,這個(gè)時(shí)候就必須對(duì)轉(zhuǎn)儲(chǔ)以后的所有更新事務(wù)執(zhí)行REDO(重做)操作.如圖1所示,Ta時(shí)刻系統(tǒng)停止運(yùn)行事務(wù)開(kāi)始轉(zhuǎn)儲(chǔ),Tb時(shí)刻轉(zhuǎn)儲(chǔ)完畢重新開(kāi)始運(yùn)行事務(wù),Tf時(shí)刻發(fā)生故障.
圖1 數(shù)據(jù)轉(zhuǎn)儲(chǔ)Fig.1 The data dump
轉(zhuǎn)儲(chǔ)的方法有靜態(tài)轉(zhuǎn)儲(chǔ)和動(dòng)態(tài)轉(zhuǎn)儲(chǔ).
2.2.1 靜態(tài)轉(zhuǎn)儲(chǔ)靜態(tài)轉(zhuǎn)儲(chǔ)在執(zhí)行的過(guò)程中要保證系統(tǒng)中沒(méi)有任何事務(wù)運(yùn)行,也就是說(shuō)轉(zhuǎn)儲(chǔ)期間不允許對(duì)數(shù)據(jù)庫(kù)的任何數(shù)據(jù)更新操作.其優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,但是由于轉(zhuǎn)儲(chǔ)需要耗費(fèi)一定的時(shí)間,而在則個(gè)期間又不能運(yùn)行事務(wù),所以降低了數(shù)據(jù)庫(kù)的可用性.
2.2.2 動(dòng)態(tài)轉(zhuǎn)儲(chǔ)動(dòng)態(tài)轉(zhuǎn)儲(chǔ)恰好克服了靜態(tài)轉(zhuǎn)儲(chǔ)的缺點(diǎn),在進(jìn)行動(dòng)態(tài)轉(zhuǎn)儲(chǔ)期間是可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀或?qū)懖僮鞯?也就是說(shuō)形成了一種并發(fā)執(zhí)行的機(jī)制,但是由于轉(zhuǎn)儲(chǔ)期間有事務(wù)對(duì)數(shù)據(jù)執(zhí)行修改操作,所以得到的數(shù)據(jù)副本文件不一定能保證它們是正確的.
要利用動(dòng)態(tài)轉(zhuǎn)儲(chǔ)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的恢復(fù),就必須借助另一個(gè)重要的概念,即日志文件.
備份操作并不是每時(shí)每刻都能執(zhí)行的,它是一個(gè)定期執(zhí)行的操作.所以單純使用備份的數(shù)據(jù)庫(kù)文件,只能說(shuō)是把數(shù)據(jù)庫(kù)恢復(fù)制作備份的那一時(shí)刻.而日志文件是實(shí)時(shí)的,它恰好是對(duì)是對(duì)后備副本的一個(gè)補(bǔ)充,就好比是一本值班日記,按照時(shí)間的先后順序,記錄了事務(wù)對(duì)數(shù)據(jù)庫(kù)中所有數(shù)據(jù)的更新操作.
當(dāng)磁盤(pán)發(fā)生故障造成DB損壞時(shí),先利用備份恢復(fù)大部分?jǐn)?shù)據(jù)庫(kù),然后運(yùn)行數(shù)據(jù)庫(kù)日志,將備份后所做的更新操作在重做一遍,從而使DB完全恢復(fù).
為保證日志[5]的安全,不能把日志文件和主數(shù)據(jù)庫(kù)存儲(chǔ)在相同的存儲(chǔ)設(shè)備上,要把兩者分開(kāi)存儲(chǔ),以保證發(fā)生故障時(shí)不是日志文件和DB同時(shí)都被破壞,否則日志也就失去了本來(lái)的作用.日志文件總共有兩種使用格式.
3.2.1 以記錄為單位的日志文件系統(tǒng)把事務(wù)開(kāi)始(BEGIN TRANSACTION)、事務(wù)提交(COMMIT)或事務(wù)撤消(ROLLBACK),以及對(duì)數(shù)據(jù)庫(kù)的插入、刪除、修改等每一個(gè)操作作為一條記錄存放到日志文件中.每條日志記錄的主要內(nèi)容如下:
(1)事務(wù)的標(biāo)識(shí)符號(hào),即標(biāo)明是哪個(gè)事務(wù),如T1,T2等;
(2)操作的基本類(lèi)型,包括增、刪、改3種操作;
(3)事務(wù)操作的數(shù)據(jù)庫(kù)對(duì)象,即對(duì)哪條記錄進(jìn)行操作;
(4)數(shù)據(jù)被修改之前的舊值;
(5)數(shù)據(jù)被修改之后的新值.
3.2.2 以數(shù)據(jù)塊為單位的日志文件以數(shù)據(jù)塊為單位的日志文件,其中除了要標(biāo)明事務(wù)的標(biāo)識(shí)之外,還要標(biāo)明以數(shù)據(jù)塊為單位的更新前的舊值和更新后的新值.
如果數(shù)據(jù)庫(kù)發(fā)生了事務(wù)故障和系統(tǒng)故障,那么對(duì)數(shù)據(jù)庫(kù)的恢復(fù)必須使用日志文件[6].
一個(gè)數(shù)據(jù)庫(kù)修改由兩個(gè)操作組成,一是將更新的數(shù)據(jù)寫(xiě)到數(shù)據(jù)庫(kù)中,二是將表示這個(gè)修改的日志寫(xiě)到日志文件中,在這兩個(gè)操作之間有可能發(fā)生故障.所以登記日志文件應(yīng)遵循的兩條規(guī)則:
(1)登記的次序嚴(yán)格按照并發(fā)事務(wù)執(zhí)行的時(shí)間次序.
(2)必須先寫(xiě)日志文件后寫(xiě)DB.
若先寫(xiě)數(shù)據(jù)庫(kù),再寫(xiě)日志,萬(wàn)一在寫(xiě)日志前發(fā)生故障,則這個(gè)數(shù)據(jù)庫(kù)修改未登記,故障恢復(fù)時(shí)就不會(huì)知道有這個(gè)修改,當(dāng)然也不可能恢復(fù).若先寫(xiě)日志后寫(xiě)數(shù)據(jù)庫(kù),假設(shè)在寫(xiě)數(shù)據(jù)庫(kù)前發(fā)生故障,則在按日志進(jìn)行故障恢復(fù)時(shí)一定能發(fā)現(xiàn)這個(gè)修改并撤消,只不過(guò)多執(zhí)行一次不必要的撤消操作.例如:欲將數(shù)據(jù)庫(kù)中某記錄字段的值由20改為100,登記日志文件后發(fā)生故障,則字段值仍為20,日志中不會(huì)登記該事務(wù)的COMMIT或ROLLBACK記錄,事務(wù)未完成,恢復(fù)時(shí)對(duì)該操作做撤消處理,將字段值改為該修改操作的舊值20,數(shù)據(jù)庫(kù)內(nèi)容不變[7].
當(dāng)數(shù)據(jù)庫(kù)系統(tǒng)中有故障發(fā)生時(shí),可以把數(shù)據(jù)庫(kù)后援副本和日志文件結(jié)合起來(lái),對(duì)數(shù)據(jù)庫(kù)進(jìn)行恢復(fù)操作,但是由于不同的故障發(fā)生的原因不同,所以對(duì)不同的故障也有不同的恢復(fù)方法,下面簡(jiǎn)單介紹下各種故障的恢復(fù)策略[8].
事務(wù)故障是指事務(wù)沒(méi)有運(yùn)行到最后一條語(yǔ)句,就意外的中止了.其恢復(fù)基本步驟如圖2所示.
圖2 事務(wù)故障恢復(fù)Fig.2 Transaction recovery
在整個(gè)恢復(fù)過(guò)程中,是以日志文件為主要依據(jù),如果事務(wù)是意外終止了,那么就必須通過(guò)反向查找日志文件,對(duì)這些事務(wù)進(jìn)行操作,就是說(shuō)對(duì)事務(wù)已經(jīng)修改過(guò)的數(shù)據(jù)項(xiàng),用原來(lái)的舊值代替它的新值.
如果數(shù)據(jù)庫(kù)執(zhí)行過(guò)程中,是系統(tǒng)的原因造成了某些故障的發(fā)生,那么會(huì)由恢復(fù)管理子系統(tǒng)在系統(tǒng)重啟時(shí)自動(dòng)完成對(duì)數(shù)據(jù)庫(kù)的恢復(fù),不需要用戶(hù)干預(yù)[9].其恢復(fù)的基本步驟如下:
(1)從日志文件的第一條語(yǔ)句開(kāi)始掃描,查找REDO隊(duì)列和UNDO隊(duì)列;
(2)對(duì)Undo隊(duì)列事務(wù)進(jìn)行撤銷(xiāo)操作;
(3)對(duì)Redo隊(duì)列中的事務(wù)重新執(zhí)行,如圖3所示.
圖3 系統(tǒng)故障恢復(fù)Fig.3 Systemrecovery
介質(zhì)故障一般情況下一旦發(fā)生,那么就說(shuō)明存儲(chǔ)在當(dāng)前磁盤(pán)上的數(shù)據(jù)庫(kù)文件被損壞,那么一般要借助前面所提到的后備副本來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行恢復(fù)[10].恢復(fù)的基本步驟如下:
(1)把之前做好的后備副本裝入,對(duì)數(shù)據(jù)庫(kù)進(jìn)行恢復(fù),一般得到的是跟轉(zhuǎn)儲(chǔ)時(shí)刻相同的數(shù)據(jù)庫(kù);
(2)裝入相應(yīng)的日志文件副本,重做已完成的事務(wù).
首先掃描日志文件,把故障時(shí)已經(jīng)成功完成的事務(wù)重新處理,對(duì)故障時(shí)候還沒(méi)有完成的事務(wù)進(jìn)行撤銷(xiāo),如圖4所示.
圖4 介質(zhì)故障恢復(fù)Fig.4 Dielectric recovery
數(shù)據(jù)庫(kù)的恢復(fù)技術(shù),在整個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)中的地位是不可被替代的.這是一種對(duì)數(shù)據(jù)庫(kù)的被動(dòng)的保護(hù)方法,相應(yīng)的在對(duì)于數(shù)據(jù)庫(kù)也可以采用主動(dòng)的完整性、安全性及并發(fā)控制策略,主動(dòng)的保護(hù)措施和被動(dòng)的保護(hù)措施相結(jié)合,盡可能的保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)是正確的和有效的.要想實(shí)現(xiàn)數(shù)據(jù)安全有效的備份,關(guān)鍵在于如何正確的選擇備份策略,這還需要在使用過(guò)程中不斷累積經(jīng)驗(yàn).
[1] 段婷.數(shù)據(jù)庫(kù)恢復(fù)技術(shù)的探討[J].太原鐵道科技,2010(4):25-29.
[2] 來(lái)賓,譚明勇.數(shù)據(jù)庫(kù)原理與應(yīng)用[M].北京:冶金工業(yè)出版社,2003:143.
[3] 陳文捷,姚紅星.網(wǎng)絡(luò)環(huán)境下計(jì)算機(jī)病毒新特征及其防范[J].河南科技學(xué)院學(xué)報(bào):自然科學(xué)版,2010,38(1):102-104.
[4] 薩師煊,王珊.數(shù)據(jù)庫(kù)系統(tǒng)概論[M].北京:高等教育出版社,2006:282-283.
[5] 簡(jiǎn)云松.數(shù)據(jù)庫(kù)恢復(fù)技術(shù)探討[J].軟件導(dǎo)刊,2008(8):102-103.
[6] 范麗雅,王萬(wàn)森,關(guān)永.數(shù)據(jù)庫(kù)中數(shù)據(jù)恢復(fù)的研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2008(3):563-565.
[7] 林烈青.基于事務(wù)日志的數(shù)據(jù)庫(kù)恢復(fù)機(jī)制研究[J].現(xiàn)代計(jì)算機(jī),2009(8):40-42.
[8] 鮑曉娟.淺談數(shù)據(jù)庫(kù)恢復(fù)技術(shù)[J].赤峰學(xué)院學(xué)報(bào):自然科學(xué)版,2011(4):45-47.
[9] 許春艷.SQLServer 2005數(shù)據(jù)庫(kù)恢復(fù)技術(shù)探索[J].硅谷,2011(8):33-36.
[10] 謝搶來(lái),余麗娜,姚磊岳.SQLServer數(shù)據(jù)庫(kù)異地備份的研究與實(shí)現(xiàn)[J].江西藍(lán)天學(xué)院學(xué)報(bào),2009(3):89-91.