選擇是否恢復(fù)整個(gè)SQL Server的方法介紹
這有一個(gè)具體例子:如果你有一個(gè)單個(gè)的出現(xiàn)問題的文件。這個(gè)文件有50MB大小,而你的整個(gè)數(shù)據(jù)庫運(yùn)行著大約有幾十億的字節(jié),這樣的話如果能恢復(fù)單個(gè)失敗文件的話就顯的非常有意義。這樣的事情發(fā)生的一個(gè)情景是當(dāng)文件或者文件組在單獨(dú)的驅(qū)動(dòng)器上,而驅(qū)動(dòng)器出現(xiàn)了問題。通常,僅僅恢復(fù)單個(gè)文件或者文件組會(huì)使總的停止時(shí)間縮短,因?yàn)樗黠@減少了需要恢復(fù)的總的數(shù)據(jù)量。
為什么你不選擇這么做呢?這有一些原因:
你需要有事務(wù)日志備份。如果你想從備份中恢復(fù)一個(gè)文件或者文件組,你同時(shí)也需要恢復(fù)與它們一起創(chuàng)建的事務(wù)記錄備份,從而使整個(gè)數(shù)據(jù)庫能夠處于一個(gè)一致的狀態(tài)。在SQL Server 2000 和 2005中,你需要使用Full Recovery或者Bulk-Logged Recovery模式(也就是說不是Simple Recovery)來使它成為可能。我應(yīng)該指出SQL Server的實(shí)現(xiàn)者們并沒有盡他們的努力來完成判斷從上一次備份一個(gè)文件或者文件組是否已經(jīng)被修改了的功能。如果沒有被改變,那么事務(wù)記錄是沒有什么必要的。但是,總的來說,還是需要事務(wù)記錄備份的,如果你現(xiàn)在還沒有一個(gè)備份事務(wù)記錄的恢復(fù)或者備份計(jì)劃,那么現(xiàn)在就創(chuàng)建一個(gè)吧。
在要恢復(fù)的文件或者文件組中的表格與數(shù)據(jù)庫中其他的表格之間的數(shù)據(jù)不一致性成為需要考慮的一個(gè)問題。如果你有相互之間依賴的表格,并且這些表格沒有被存儲(chǔ)在相同的物理文件或者文件組中(這有時(shí)是不可避免的),僅僅恢復(fù)一個(gè)文件或者文件組可能會(huì)導(dǎo)致它與數(shù)據(jù)庫其他部分不同步。例如,你有一個(gè)表格被另一個(gè)表格用JOIN關(guān)聯(lián),并且這個(gè)JOIN使用了一個(gè)視圖和存儲(chǔ)過程,這時(shí)僅僅恢復(fù)一個(gè)而不恢復(fù)另一個(gè)可能會(huì)有問題。
當(dāng)你在數(shù)據(jù)庫中只有一個(gè)文件組。如果你的所有的數(shù)據(jù)僅僅存儲(chǔ)在一個(gè)文件或者文件組中,并且它又不是一個(gè)特別大的數(shù)據(jù)庫時(shí),會(huì)發(fā)生什么事情呢?那時(shí)恢復(fù)一個(gè)文件或者文件組的努力就變的沒有什么意義了。
選擇性的恢復(fù)文件或者文件組的主要原因是當(dāng)恢復(fù)數(shù)據(jù)庫很大,以至于恢復(fù)整個(gè)數(shù)據(jù)庫的代價(jià)很大的時(shí)候,使得對(duì)數(shù)據(jù)庫的局部損壞的恢復(fù)成為可能。在一個(gè)非常小的輕量級(jí)的數(shù)據(jù)庫里,和nonproduction系統(tǒng)中,或者數(shù)據(jù)庫中只有一個(gè)文件組的時(shí)候,實(shí)現(xiàn)選擇性的恢復(fù)功能就顯的沒有太大的意義,因?yàn)檫@時(shí)恢復(fù)整個(gè)數(shù)據(jù)庫和恢復(fù)單個(gè)的文件或者文件組沒有什么太大的區(qū)別。
我發(fā)現(xiàn)大多數(shù)時(shí)候當(dāng)人們想使用文件或者文件組恢復(fù)時(shí),他們實(shí)際上是想把一個(gè)特定的表格恢復(fù)到先前的一個(gè)點(diǎn)的時(shí)刻的狀態(tài)。這在SQL Server中不是一個(gè)顯式支特的特性,但是存在這么做的方法,倘若你不介意由于采用這種方法而需要手工的來管理可能產(chǎn)生的不一致(就想上面#2所說的)。如果你手邊就有一個(gè)數(shù)據(jù)庫備份的話,你可以簡單的恢復(fù)那個(gè)備份,僅僅把它看作是相同數(shù)據(jù)庫的不同名字的實(shí)例。接著,通過事務(wù)記錄把數(shù)據(jù)庫向前滾動(dòng)到指定的點(diǎn)(如果需要這樣做的話),然后手工的把當(dāng)前的數(shù)據(jù)庫拷貝到目標(biāo)數(shù)據(jù)庫中。
我自己已經(jīng)實(shí)驗(yàn)過這種方法幾次,但是僅僅只有一個(gè)表格沒有與相同數(shù)據(jù)庫中的其他的表格有很大的關(guān)聯(lián)。我的例子涉及了一個(gè)包含了留言版系統(tǒng)的聊天網(wǎng)站。我不得不經(jīng)常恢復(fù)一些在留言版上被意外刪除的消息,這些是自包含的:從留言版表格的數(shù)據(jù)產(chǎn)生的唯一的JOINs是外部的而不是內(nèi)部的。因此,我可以隨意的更新表格因?yàn)槲抑牢也粫?huì)讓那個(gè)表格與其他表格不同步的。
在SQL Server 2000和它更高的版本中,當(dāng)你做一個(gè)RESTORE操作的時(shí)候你可以使用PARTIAL子句,從而使僅僅需要的文件組數(shù)據(jù)被恢復(fù)。這作為一個(gè)時(shí)間和空間上的節(jié)約開銷的措施是非常有用的:你不需要進(jìn)行繁重的恢復(fù)所有數(shù)據(jù)的工作,而僅僅只需要對(duì)一個(gè)表格進(jìn)行操作。而且很可能也沒有足夠的空間來進(jìn)行完全的恢復(fù)操作。
