文章出處

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

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

 
備份過程:

1-完整備份之后有無對數據庫做過修改,如果有,記錄數據庫的最后LSN(Last LSN)
如果完整備份之后無對數據庫做過修改,那么差異備份就沒有意義了
 
2-做差異備份時根據差異位圖讀取差異頁面內容
注意:差異位圖記錄了自從最后一次完整備份以來數據庫中有變化的頁面,這樣在做差異備份時候就不用掃全庫頁面,只需要讀取有差異的頁面
 
3-在備份之前,數據庫會做一次檢查點,備份時把最后一次檢查點的LSN記錄進去備份文件

4-把最后LSN也記錄進去備份文件
 
5-這時候數據庫的BOOTPAGE存放了數據庫最后一次完整備份的Checkpoint LSN

 
這時候備份文件里會存放幾個LSN值

FirstLSN
LastLSN
CheckpointLSN
DatabaseBackupLSN
DifferentialBaseLSN

 

BOOTPAGE里只有DifferentialBaseLSN有值

 

 

總體來說,差異備份文件里會存放

(1)下面的LSN值

FirstLSN
LastLSN
CheckpointLSN
DatabaseBackupLSN
DifferentialBaseLSN

 

(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之后,如果沒有再發生任何修改,那么是不需要放入差異備份文件里面的(如果是基于最后一次差異的差異)
因為差異位圖無法基于差異的差異,這樣會導致,有時候差異備份文件比完整備份文件還要大
 
 
--腳本

SELECT DB_ID('sss')
DBCC fileheader(16)

BACKUP DATABASE [sss] TO DISK='c:\sss_full.bak' 


RESTORE FILELISTONLY FROM DISK ='c:\sss_full.bak' 
RESTORE HEADERONLY FROM DISK ='c:\sss_full.bak' 


1585000000012200042 --backuplsn
1686000000056400078 --ckpt lsn
1686000000060800001 --last lsn




CREATE TABLE tessssss(id INT)
go




INSERT tessssss SELECT 1 UNION ALL SELECT 2

BACKUP DATABASE [sss] TO DISK='c:\sss_diff.bak' WITH Differential 



RESTORE HEADERONLY FROM DISK ='c:\sss_diff.bak'
1686000000056400078 --backuplsn
1686000000056400078 --diff lsn
1686000000065400151 --ckpt lsn
1686000000071800001 --last lsn


INSERT tessssss SELECT 3 UNION ALL SELECT 4


BACKUP DATABASE [sss] TO DISK='c:\sss_diff2.bak' WITH Differential 


RESTORE HEADERONLY FROM DISK ='c:\sss_diff2.bak'
1686000000056400078 --backuplsn
1686000000056400078 --diff lsn
1686000000071900004 --ckpt lsn
1686000000072300001 --last lsn

--FirstLSN
--LastLSN
--CheckpointLSN
--DatabaseBackupLSN
--DifferentialBaseLSN

 

 
 
MySQL的xtrabackup備份工具的原理其實也是差不多,讀取頁面,根據CheckpointLSN和頁面的LSN比較進行備份和還原
所以LSN在數據庫的備份還原里面起著重要作用
 
 
對于最后一個LSN可以參考:

您真的理解了SQLSERVER的日志鏈了嗎?
http://www.cnblogs.com/lyhabc/p/3460272.html

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

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()