天天看點

SQL Server差異備份的備份/還原原理SQL Server差異備份的備份/還原原理

記住一點:差異備份是基于最後一次完整備份的差異,而不是基于最後一次差異的差異

備份過程:

1-完整備份之後有無對資料庫做過修改,如果有,記錄資料庫的最後LSN(Last LSN)

SQL Server差異備份的備份/還原原理SQL Server差異備份的備份/還原原理

如果完整備份之後無對資料庫做過修改,那麼差異備份就沒有意義了

2-做差異備份時根據差異位圖讀取差異頁面内容

注意:差異位圖記錄了自從最後一次完整備份以來資料庫中有變化的頁面,這樣在做差異備份時候就不用掃全庫頁面,隻需要讀取有差異的頁面

3-在備份之前,資料庫會做一次檢查點,備份時把最後一次檢查點的LSN記錄進去備份檔案

4-把最後LSN也記錄進去備份檔案

5-這時候資料庫的BOOTPAGE存放了資料庫最後一次完整備份的Checkpoint LSN

這時候備份檔案裡會存放幾個LSN值

FirstLSN

LastLSN

CheckpointLSN

DatabaseBackupLSN

DifferentialBaseLSN

BOOTPAGE裡隻有DifferentialBaseLSN有值

SQL Server差異備份的備份/還原原理SQL Server差異備份的備份/還原原理

總體來說,差異備份檔案裡會存放

(1)下面的LSN值

(2)活動日志

(3)差異頁面

還原過程:

DifferentialBaseLSN作用:要還原差異備份先要還原一個完整備份,使用NORECOVERY選項,再還原差異備份,當還原差異備份的時候,資料庫根據差異備份檔案裡的DifferentialBaseLSN的值跟

資料庫BOOTPAGE儲存的DifferentialBaseLSN的值進行比較,如果對不上,那麼這個差異備份不能還原,另外一個是作為差異備份還原的基準LSN,差異備份檔案裡的CheckpointLSN如果小于DifferentialBaseLSN

那麼也是沒有必要還原

1-将頁面從差異備份檔案裡讀出來,然後讀出頁頭的LSN号,跟差異備份檔案裡的CheckpointLSN進行比較,如果大于CheckpointLSN 并小于LastLSN,那麼拿出差異備份檔案裡的活動日志對改頁面進行redo和undo

如果小于CheckpointLSN ,那麼這個頁面不需要還原,因為資料庫裡面的頁面版本比差異備份檔案裡的頁面還要新

活動日志裡的日志記錄也儲存了頁面編号,對于頁面的redo和undo是比較友善的

2-把redo和undo完畢的頁面寫回資料庫

差異備份的缺點

差異備份基于最後一次完整備份的差異,那麼,對于一個繁忙的資料庫,在一段時間内做了幾次差異備份,無論這中間有多少次Checkpoint,SQL Server依然将這些

基于完整備份的差異頁面放入差異備份檔案,按道理來說,一個頁面在一次Checkpoint之後,如果沒有再發生任何修改,那麼是不需要放入差異備份檔案裡面的(如果是基于最後一次差異的差異)

因為差異位圖無法基于差異的差異,這樣會導緻,有時候差異備份檔案比完整備份檔案還要大

SQL Server差異備份的備份/還原原理SQL Server差異備份的備份/還原原理

MySQL的xtrabackup備份工具的原理其實也是差不多,讀取頁面,根據CheckpointLSN和頁面的LSN比較進行備份和還原

是以LSN在資料庫的備份還原裡面起着重要作用

對于最後一個LSN可以參考:

您真的了解了SQLSERVER的日志鍊了嗎?

<a href="http://www.cnblogs.com/lyhabc/p/3460272.html" target="_blank">http://www.cnblogs.com/lyhabc/p/3460272.html</a>

如有不對的地方,歡迎大家拍磚o(∩_∩)o