創(chuàng )建或刪除數據庫文件;創(chuàng )建索引;執行非日志操作;自動(dòng)或手工縮小數據庫或數據庫文件大小。 如果以上各種操作正在進(jìn)行當中,且準備進(jìn)行備份則備份,處理將被終止;如果在備份過(guò)程中,打算執行以上任何操作,則操作將失敗而備份繼續進(jìn)行。
恢復就是把遭受破壞或丟失數據或出現錯誤的數據庫恢復到原來(lái)的正常狀態(tài),這一狀態(tài)是由備份決定的,但是為了維護數據庫的一致性,在備份中未完成的事務(wù)并不進(jìn)行恢復。
進(jìn)行備份和恢復的工作主要是由數據庫管理員來(lái)完成的。實(shí)際上數據庫管理員日常比較重要、比較頻繁的工作就是對數據庫進(jìn)行備份和恢復。
注意:如果在備份或恢復過(guò)程中發(fā)生中斷,則可以重新從中斷點(diǎn)開(kāi)始執行備份或恢復。這在備份一個(gè)大型數據庫時(shí)極有價(jià)值。
15.1.2 數據庫備份的類(lèi)型
在SQL Server 2000 中有四種備份類(lèi)型,分別為; - 數據庫備份(Database Backups)
- 事務(wù)日志備份(Transaction Log Backup)
- 差異備份(Differential Database Backups)
- 文件和文件組備份(File and File Group Backup)
下面我們將詳細介紹其所表述的內容,并涉及到一些使用時(shí)注意事項。
1 數據庫備份(Database Backups) 數據庫備份是指對數據庫的完整備份,包括所有的數據以及數據庫對象。實(shí)際上備份數據庫過(guò)程就是首先將事務(wù)日志寫(xiě)到磁盤(pán)上,
然后根據事務(wù)創(chuàng )建相同的數據庫和數據庫對象以及拷貝數據的過(guò)程。由于是對數據庫的完全備份,所以這種備份類(lèi)型不僅速度較慢,
而且將占用大量磁盤(pán)空間。正因為如此,在進(jìn)行數據庫備份時(shí),常將其安排在晚間,因為此時(shí)整個(gè)數據庫系統幾乎不進(jìn)行其它事務(wù)操作,從而可以提高數據庫備份的速度。
在對數據庫進(jìn)行完全備份時(shí),所有未完成的事務(wù)或者發(fā)生在備份過(guò)程中的事務(wù)都不會(huì )被備份。如果您使用數據庫備份類(lèi)型,
則從開(kāi)始備份到開(kāi)始恢復這段時(shí)間內發(fā)生的任何針對數據庫的修改將無(wú)法恢復。所以我們總是在一定的要求或條件下才使用這種備份類(lèi)型,比如:
- 數據不是非常重要,盡管在備份之后恢復之前數據被修改,但這種修改是可以忍受的;
- 通過(guò)批處理或其它方法,在數據庫恢復之后可以很容易地重新實(shí)現在數據損壞前發(fā)生的修改;
- 數據庫變化的頻率不大。
在進(jìn)行數據庫備份時(shí),如果您在備份完成之后又進(jìn)行了事務(wù)日志備份,則在數據庫備份過(guò)程中發(fā)生的事務(wù)將被備份:但若只進(jìn)行數據庫備份,常將數據庫選項“trunc.log onchkpt” 設置為true,這樣每次在運行到檢查點(diǎn)(checkpoint) 時(shí),都會(huì )將事務(wù)日志截斷。
注意:如果對數據一致性要求較高(將數據庫恢復到發(fā)生損壞的刻),則不應使用數據庫備份。
2 事務(wù)日志備份(Transaction Log Backup) 事務(wù)日志備份是指對數據庫發(fā)生的事務(wù)進(jìn)行備份,包括從上次進(jìn)行事務(wù)日志備份、差異備份和數據庫完全備份之后,所有已經(jīng)完成的事務(wù)。在以下情況下我們常選擇事務(wù)日志備份。
- 不允許在最近一次數據庫備份之后發(fā)生數據丟失或損壞現象;
- 存儲備份文件的磁盤(pán)空間很小或者留給進(jìn)行備份操作的時(shí)間有限,例如兆字節級的數據庫需要很大的磁盤(pán)空間和備份時(shí)間;
- 準備把數據庫恢復到發(fā)生失敗的前一點(diǎn);
- 數據庫變化較為頻繁。
由于事務(wù)日志備份僅對數據庫事務(wù)日志進(jìn)行備份,所以其需要的磁盤(pán)空間和備份時(shí)間都比數據庫備份(備份數據和事務(wù))少得多,這是它的優(yōu)點(diǎn)所在。正是基于此,我們在備份時(shí)常采用這樣的策略,即每天進(jìn)行一次數據庫備份,而以一個(gè)或幾個(gè)小時(shí)的頻率備份事務(wù)日志。這樣利用事務(wù)日志備份,我們就可以將數據庫恢復到任意一個(gè)創(chuàng )建事務(wù)日志備份的時(shí)刻。
但是,創(chuàng )建事務(wù)日志備份卻相對比較復雜。因為在使用事務(wù)日志對數據庫進(jìn)行恢復操作時(shí),還必須有一個(gè)完整的數據庫備份,而且事務(wù)日志備份恢復時(shí)必須要按一定的順序進(jìn)行。比如在上周末對數據庫進(jìn)行了完整的數據庫備份,在從周一到本周末的每一天都進(jìn)行一次事務(wù)日志備份,那么若要打算對數據庫進(jìn)行恢復,則首先恢復數據庫備份,然后按照順序恢復從周一到本周末的事務(wù)日志備份。
有些時(shí)侯數據庫事務(wù)日志會(huì )被中斷,例如數據庫中執行了非日志操作(如創(chuàng )建索引、創(chuàng )建或刪除數據庫文件、自動(dòng)或手工縮小數據庫文件大?。?,此時(shí)應該立即創(chuàng )建數據庫或差異備份,然后再進(jìn)行事務(wù)日志備份。以前進(jìn)行的事務(wù)日志備份也沒(méi)有必要了。
3 差異備份(Differential Database Backups) 差異備份是指將最近一次數據庫備份以來(lái)發(fā)生的數據變化備份起,來(lái)因此差異備份實(shí)際上是一種增量數據庫備份。與完整數據庫備份相比,差異備份由于備份的數據量較小,所以備份和恢復所用的時(shí)間較短。通過(guò)增加差異備份的備份次數,可以降低丟失數據的風(fēng)險,將數據庫恢復至進(jìn)行最后一次差異備份的時(shí)刻,但是它無(wú)法像事務(wù)日志備份那樣提供到失敗點(diǎn)的無(wú)數據損失備份。
但在實(shí)際中為了最大限度地減少數據庫恢復時(shí)間以及降低數據損失數量,我們常一起使用數據庫備份、事務(wù)日志備份和差異備份,而采用的備份方案是這樣的;
- 首先有規律地進(jìn)行數據庫備份,比如每晚進(jìn)行備份;
- 其次以較小的時(shí)間間隔進(jìn)行差異備份,比如三個(gè)小時(shí)或四個(gè)小時(shí);
- 最后在相臨的兩次差異備份之間進(jìn)行事務(wù)日志備份,可以每二十或三十分鐘一次。
這樣在進(jìn)行恢復時(shí),我們可先恢復最近一次的數據庫備份,接著(zhù)進(jìn)行差異備份,最后進(jìn)行事務(wù)日志備份的恢復。
但是,在更多的情況下我們希望數據庫能恢復到數據庫失敗那一時(shí)刻,那么我們該怎樣做呢?下面的方法也許會(huì )有大幫助。 - 首先如果能夠訪(fǎng)問(wèn)數據庫事務(wù)日志文件則應備份當前正處于活動(dòng)狀態(tài)的事務(wù)日志;
- 其次恢復最近一次數據庫備份;
接著(zhù)恢復最近一次差異備份;最后按順序恢復自差異備份以來(lái)進(jìn)行的事務(wù)日志備份。 當然,如果無(wú)法備份當前數據庫正在進(jìn)行的事務(wù),則只能把數據庫恢復到最后一次事務(wù)日志備份的狀態(tài),而不是數據庫失敗點(diǎn)。
4 文件和文件組備份(File and File Group Backup)
文件或文件組備份是指對數據庫文件或文件夾進(jìn)行備份,但其不像完整的數據庫備份那樣同時(shí)也進(jìn)行事務(wù)日志備份。使用該備份方法可提高數據庫恢復的速度,因為其僅對遭到破壞的文件或文件組進(jìn)行恢復。
但是在使用文件或文件組進(jìn)行恢復時(shí),仍要求有一個(gè)自上次備份以來(lái)的事務(wù)日志備份來(lái)保證數據庫的一致性。所以在進(jìn)行完文件或文件組備份后應再進(jìn)行事務(wù)日志備份。否則備份在文件或文件組備份中所有數據庫變化將無(wú)效。
如果需要恢復的數據庫部分涉及到多個(gè)文件或文件組,則應把這些文件或文件組都進(jìn)行恢復。例如,如果在創(chuàng )建表或索引時(shí),表或索引是跨多個(gè)文件或文件組,則在事務(wù)日志備份結束后應再對表或索引有關(guān)的文件或文件組進(jìn)行備份,否則在文件或文件組恢復時(shí)將會(huì )出錯。
15.1.3 備份和恢復的策略
通常而言,我們總是依賴(lài)所要求的恢復能力(如將數據庫恢復到失敗點(diǎn))、備份文件的大?。ㄈ缤瓿蓴祿靷浞莼蛑贿M(jìn)行事務(wù)日志的備份或是差異數據庫備份)以及留給備份的時(shí)間等來(lái)決定該使用哪種類(lèi)型的備份。常用的備份選擇方案有:僅僅進(jìn)行數據庫備份、或在進(jìn)行數據庫備份的同時(shí)進(jìn)行事務(wù)日志備份,或使用完整數據庫備份和差異數據庫備份。
選用怎樣的備份方案將對備份和恢復產(chǎn)生直接影響,而且也決定了數據庫在遭到破壞前后的一致性水平。所以在做出該決策時(shí),您必須認識到以下幾個(gè)問(wèn)題: - 如果只進(jìn)行數據庫備份,那么將無(wú)法恢復自最近一次數據庫備份以來(lái)數據庫中所發(fā)生的所有事務(wù)。這種方案的優(yōu)點(diǎn)是簡(jiǎn)單,而且在進(jìn)行數據庫恢復時(shí)操作也很方便;
- 如果在進(jìn)行數據庫備份時(shí)也進(jìn)行事務(wù)日志備份,那么可以將數據庫恢復到失敗點(diǎn),那些在失敗前未提交的事務(wù)將無(wú)法恢復,但如果您在數據庫失敗后立即對當前處于活動(dòng)狀態(tài)的事務(wù)進(jìn)行備份,則未提交的事務(wù)也可以恢復。
- 從以上可以看出,對數據庫一致性的要求程度成為我們選擇這樣或那樣的備份方案的主要的普遍性原因。但在某些情況下對數據庫備份提出更為嚴格的要求,例如在處理比較重要業(yè)務(wù)的應用環(huán)境中,常要求數據庫服務(wù)器連續工作,至多只留有一小段時(shí)間來(lái)執行系統維護任務(wù),在該情況下一旦出現系統失敗,則要求數據庫在最短時(shí)間內立即恢復到正常狀態(tài),以避免丟失過(guò)多的重要數據,由此可見(jiàn)備份或恢復所需時(shí)間往往也成為我們選擇何種備份方案的重要影響因素。
那么如何才能減少備份和恢復所花費時(shí)間呢?SQL Server 提供了幾種方法來(lái)減少備份或恢復操作的執行時(shí)間。 - 使用多個(gè)備份設備來(lái)同時(shí)進(jìn)行備份處理。同理,可以從多個(gè)備份設備上同時(shí)進(jìn)行數據庫恢復操作處理;
- 綜合使用完整數據庫備份、差異備份或事務(wù)日志備份來(lái)減少每次的需要備份的數據數量;
- 使用文件或文件組備份以及事務(wù)日志備份,這樣可以只備份或恢復那些包含相關(guān)數據的文件,而不是整個(gè)數據庫。
- 另外需要注意的是,在備份時(shí)我們也要決定該使用哪種備份設備如磁盤(pán)或磁帶,并且決定如何在備份設備上創(chuàng )建備份,比如將備份添加到備份設備上或將其覆蓋。
在SQL Server 2000 中,有三種數據庫恢復模式,它們分別是:簡(jiǎn)單恢復(SimpleRecovery)、 完全恢復(Full Recovery)、 批日志恢復(Bulk-logged Recovery)。
1 簡(jiǎn)單恢復(Simple Recovery)
所謂簡(jiǎn)單恢復就是指在進(jìn)行數據庫恢復時(shí)僅使用了數據庫備份或差異備份,而不涉及事務(wù)日志備份。簡(jiǎn)單恢復模式可使數據庫恢復到上一次備份的狀態(tài),但由于不使用事務(wù)日志備份來(lái)進(jìn)行恢復,所以無(wú)法將數據庫恢復到失敗點(diǎn)狀態(tài)。當選擇簡(jiǎn)單恢復模式時(shí)常使用的備份策略是:首先進(jìn)行數據庫備份,然后進(jìn)行差異備份。
2 完全恢復(Full Recovery)
完全數據庫恢復模式是指通過(guò)使用數據庫備份和事務(wù)日志備份將數據庫恢復到發(fā)生失敗的時(shí)刻,因此幾乎不造成任何數據丟失,這成為對付因存儲介質(zhì)損壞而數據丟失的最佳方法。為了保證數據庫的這種恢復能力,所有的批數據操作比如SELECT INGO、創(chuàng )建索引都被寫(xiě)入日志文件。選擇完全恢復模式時(shí)常使用的備份策略是:
- 首先進(jìn)行完全數據庫備份;
- 然后進(jìn)行差異數據庫備份;
- 最后進(jìn)行事務(wù)日志的備份。
如果準備讓數據庫恢復到失敗時(shí)刻必須對數據庫失敗前正處于運行狀態(tài)的事務(wù)進(jìn)行備份。
3 批日志恢復(Bulk-logged Recovery)
批日志恢復在性能上要優(yōu)于簡(jiǎn)單恢復和完全恢復模式,它能盡最大努力減少批操作所需要的存儲空間。這些批操作主要是:SELECT INTO 批裝載操作(如bcp 操作或批插入操作)、創(chuàng )建索引針對大文本或圖像的操作(如WRITETEXT、 UPDATETEXT)。選擇批日志恢復模式所采用的備份策略與完全恢復所采用的恢復策略基本相同。
從以上的論述中我們可以看到,在實(shí)際應用中,備份策略和恢復策略的選擇不是相互孤立的,而是有著(zhù)緊密的聯(lián)系。我們并不僅僅是因為數據庫備份為數據庫恢復提供了 “原材料”這一事實(shí),以便在采用何種數據庫恢復模式的決策中考慮該怎樣進(jìn)行數據庫備份,更多是因為在選擇該使用哪種備份類(lèi)型時(shí)我們必須考慮到當使用該備份進(jìn)行數據庫恢復時(shí),它能把遭到損壞的數據庫“帶”到怎樣的狀態(tài)(是數據庫失敗的時(shí)刻,還是最近一次備份的時(shí)刻)。但有一點(diǎn)我們必須強調,即備份類(lèi)型的選擇和恢復模式的確定都應服從于這一目標:盡最大可能,以最快速度減少或消滅數據丟失。