SQL Server 2008數據備份與還原(原理篇)

from http://1710194.blog.51cto.com/1700194/1424153

     可能許多同學對SQL Server的備份和還原有一些瞭解,也可能經常使用備份和還原功能,我相信除DBA之外我們大部分開發員隊伍對備份和還原只使用最基礎的功能,對它也只有一個大概的認識。

1、恢復模式

右鍵數據庫屬性--選項--可以看到“恢復模式”,SQL Server 2008數據庫恢復模式分爲三種:完整恢復模式、大容量日誌恢復模式、簡單恢復模式,如下圖。

完整恢復模式

爲默認恢復模式。 它會完整記錄下操作數據庫的每一個步驟。使用完整恢復模式可以將整個數據庫恢復到一個特定的時間點,這個時間點可以是最近一次可用的備份、一個特定的日期和時間或標記的事務。

大容量日誌恢復模式

簡單地說就是要對大容量操作進行最小日誌記錄,節省日誌文件的空間(如導入數據、批量更新、SELECT INTO等操作時)。比如一次在數據庫中插入數十萬條記錄時,在完整恢復模式下每一個插入記錄的動作都會記錄在日誌中,使日誌文件變得非常大,在大容量日誌恢復模式下,只記錄必要的操作,不記錄所有日誌,這樣一來,可以大大提高數據庫的性能,但是由於日誌不完整,一旦出現問題,數據將可能無法恢復。因此,一般只有在需要進行大量數據操作時纔將恢復模式改爲大容量日誌恢復模式,數據處理完畢之後,馬上將恢復模式改回完整恢復模式

簡單恢復模式

在該模式下,數據庫會自動把不活動的日誌***,因此簡化了備份的還原,但因爲沒有事務日誌備份,所以不能恢復到失敗的時間點。通常,此模式只用於對數據庫數據安全要求不太高的數據庫,並且在該模式下,數據庫只能做完整和差異備份

可以看出三種恢復模式的區別在於對“日誌”的處理方式不同,就“日誌”大小來看:完全恢復模式 > 大容量日誌恢復模式 > 簡單恢復模式。

2、備份方式

SQL Server 2008提供了四種備份方式:完整備份、差異備份、事務日誌備份、文件和文件組備份。

完整備份

備份整個數據庫的所有內容,包括事務日誌。該備份類型需要比較大的存儲空間來存儲備份文件,備份時間也比較長,在還原數據時,也只要還原一個備份文件。

差異備份

差異備份是完整備份的補充,只備份上次完整備份後更改的數據。相對於完整備份分來說,差異備份的數據量比完整數據備份小,備份的速度也比完整備份要快。因此,差異備份通常作爲常用的備份方式。在還原數據時,要先還原前一次做的完整備份,然後還原最後一次所做的差異備份 ,這樣才能讓數據庫裏的數據恢復到與最後一次差異備份時的內容相同。

事務日誌備份

事務日誌備份只備份事務日誌裏的內容。事務日誌記錄了上一次完整備份或事務日誌備份後數據庫的所有變動過程。事務日誌記錄的是某一段時間內的數據庫變動情況,因此在進行事務日誌備份之前,必須要進行完整備份。與差異備份類似,事務日誌備份生成的文件較小、佔用時間較短,但是在還原數據時,除了先要還原完整備份之外,還要依次還原每個事務日誌備份,而不是隻還原最後一個事務日誌備份(這是與差異備份的區別)。

文件和文件組備份

如果在創建數據庫時,爲數據庫創建了多個數據庫文件或文件組,可以使用該備份方式。使用文件和文件組備份方式可以只備份數據庫中的某些文件,該備份方式在數據庫文件非常龐大時十分有效,由於每次只備份一個或幾個文件或文件組,可以分多次來備份數據庫,避免大型數據庫備份的時間過長。另外,由於文件和文件組備份只備份其中一個或多個數據文件,當數據庫裏的某個或某些文件損壞時,可能只還原損壞的文件或文件組備份。

3、舉例說明

完整備份

例如,在2012年1月1日早上8點進行了完整備份,那麼將來在還原時,就可以恢復到2012年1月有1日早上8點時的數據庫狀態。

差異備份

差異備份是備份完整備份後的數據變動情況。例如,在2012年1月1日早上8點進行了完整備份後,在1月2日和1月3日又分別進行了差異備份,那麼在1月2日的差異備份裏記錄的是從1月1日到1月2日這一段時間裏的數據變動情況,而在1月3日的差異備份裏記錄的是從1月1日到1月3日這一段時間裏的數據變動情況。因此,如果要還原到1月3日的狀態,只要先還原1月1日做的完整備份,再還原1月3日做的差異備份就可以了。

事務日誌備份

事務日誌備份是以事務日誌文件作爲備份對象,相當於將數據庫裏的每一個操作都記錄下來了。假設在2012年1月1日早上8點進行了完整備份後,到1月2日早上8點爲止,數據庫裏的數據變動了100次,如果此時做了差異備份,那麼差異備份記錄的是第100次數據變動後的數據庫狀態,而如果此時做了事務日誌備份,備份的將是這100次的數據變動情況。

再舉一個例子,例如在2012年1月1日早上8點進行了完整備份後,在1月2日和1月3日又進行了事務日誌備份,那麼在1月2日的事務日誌備份裏記錄的是從1月1日到1月2日這一段時間裏的數據變動情況,而在1月3日的事務日誌備份裏記錄的是從1月2日到1月3日這一段時間裏的數據變動情況。因此,如果要還原到1月3日的數據,需要先還原1月1日做的完整備份,再還原1月2日做的事務日誌備份,最後還要還原1月3日所做的事務日誌備份。

4、備份方式的選擇

瞭解了以上數據庫備份方式後,便可以針對自己的數據庫利用以上方式來備份數據庫了。合理備份數據庫需要考慮幾方面,首先是數據安全,其次是備份文件大小,最後是做備份和還原能承受的時間範圍。

數據變動量較小

例如,如果數據庫裏每天變動的數據量很小,可以每週(週日)做一次完整備份,以後的每天(下班前)做一次事務日誌備份,那麼一旦數據庫發生問題,可以將數據恢復到前一天(下班時)的狀態。

當然,也可以每週(週日)做一次完整備份,以後的每天(下班前)做一次差異備份,這樣一旦數據庫發生問題,同樣可以將數據恢復到前一天下班時的狀態。只是一週的後幾天做差異備份時,備份的時間和備份的文件都會跟着增加。但這也有一個好處,在數據損壞時,只要恢復完整備份的數據和前一天差異備份的數據即可,不需要去恢復每一天的事務日誌備份,恢復的時間會比較短。

數據變動量較大

如果數據庫裏的數據變動得比較頻繁,損失一個小時的數據都是十分嚴重的損失時,用上面的辦法備份數據就不可行了,此時可以交替使用三種備份方式來備份數據庫。

例如,每天下班時做一次完整備份,在兩次完整備份之間每隔八小時做一次差異備份,在兩次差異備份之間每隔一小時做一次事務日誌備份。如此一來,一旦數據損壞可以將數據恢復到最近一個小時以內的狀態,同時又能減少數據庫備份數據的時間和備份數據文件的大小。

數據庫文件較大

在前面還提到過當數據庫文件過大不易備份時,可以分別備份數據庫文件或文件組,將一個數據庫分多次備份。在現實操作中,還有一種情況可以使用到數據庫文件的備份。例如在一個數據庫中,某些表裏的數據變動得很少,而某些表裏的數據卻經常改變,那麼可以考慮將這些數據表分別存儲在不同的文件或文件組裏,然後通過不同的備份頻率來備份這些文件和文件組。但使用文件和文件組來進行備份,還原數據時也要分多次才能將整個數據庫還原完畢,所以除非數據庫文件大到備份困難,否則不要使用該備份方式。

尾部日誌備份

針對以上備份方案,能看出數據還是不完整嗎?比如昨天夜間12點做了完整備份,每隔一小時做了一次事務日誌備份,最後一次事務日誌備份是今天中午12點,現在是今天中午12點10分,發現數據庫數據遭到丟失或破壞,可最後一次事務日誌備份是今天中午12點,如果我此時將數據庫恢復到12點,那麼12點後至12點10分前沒遭到破壞的操作數據將丟失(比如數據庫有三個表,一個表的數據遭到破壞,其它兩個表的數據被其它用戶變動)。此時就要用到【尾部日誌備份】,尾部日誌備份原理是從最後一次事務日誌備份的時間點開始,將之後的所有操作進行備份,還原時便可以找到12點後操作的正確數據了。

注:進行尾部日誌備份時,數據庫將強制停止數據庫,此時如果不停止數據庫,還有用戶繼續操作,尾部日誌備份將失去意義。SQL Server 2012如果你最後一次備份事務日誌後,對數據進行過改動,即發生過事務日誌(也就是當前日誌文件記錄的LSN(日誌序列號)大於最後一次事務日誌備份裏記錄的最大LSN,SQL Server通過LSN來區分日誌的記錄),並尚未對尾部日誌備份,它會提示並要求你必須先做尾部備份。

5、示例操作

首先進行完整備份【MyTest.bak】,然後再基於此備份文件 進行兩次事務日誌備份,最後一次事務日誌備份時間爲【2012-8-4 23:07】。下圖:備份文件名爲【MyTest.bak】,最後一次事務日誌備份時間爲【2012-8-4 23:07】

下圖:選擇備份文件“MyTest.bak”後,此時能看到“要還原的備份集”列表裏顯示有備份文件,分別列出了完整備份文件和兩次事務日誌備份。

以上備份文件最後一次事務日誌備份時間爲【2012-8-4 23:07】,那麼,您可以還原到自首次完整備份開始後,至最後一次事務日誌備份時間期間的任何一個時間點,這就充分驗證上上文講到的事務日誌備份方式(如果後期進行過尾部日誌備份,還原時在“要還原的備份集”列表裏的最後一行會列出尾部日誌記錄)。

如果事務日誌備份有兩次,分別是“事務日誌1”、“事務日誌2”,那麼在還原時去掉“事務日誌1”複選框,“事務日誌2”也會自動去掉,但只去掉“事務日誌2”是允許的,這也充分驗證了上文講到的:“在還原數據時,除了先要還原完整備份之外,還要依次還原每個事務日誌備份,而不是隻還原最後一個事務日誌備份”,不同於差異備份可以基於完整備份,只還原最後一次差異備份即可。

若在【2012-08-04 23:36:53】插入一條數據,【2012-08-04 23:37:44】又做了一次事務日誌備份3,然後再將時間點還原到【2012-08-04 23:36:00】,還原後,此時間點後的數據就沒有了。

【注意:在還原時會提示數據庫正在使用,一般要斷開全部連接後,才能進行還原。我一般使用腳本將數據脫機再聯機,所有連接將會全部斷開】

alter database MyTest set offline with ROLLBACK IMMEDIATE--脫機 
alter database MyTest set online with ROLLBACK IMMEDIATE--聯機

6、差異備份和事務日誌備份的區別

  • 差異備份備份的是數據,事務日誌備份的是數據變動過程(同樣可以理解爲數據)。

  • 差異備份只備份上次“完整備份”後更改的數據,而事務日誌備份了上次“完整備份”或“事務日誌備份”後數據庫的所有變動過程

  • 還原時,一次“差異備份”+最近“完整備份”就可以實現還原,而一次“事務日誌備份”+中間所有“事務日誌備份”+最近“完整備份”纔可以實現還原。

  • 由於差異備份時累加的,因此差異備份大小 > 事務日誌備份


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章