close
文章出處
還原過程:
1-將頁面從差異備份文件里讀出來,然后讀出頁頭的LSN號,跟差異備份文件里的CheckpointLSN進行比較,如果大于CheckpointLSN 并小于LastLSN,那么拿出差異備份文件里的活動日志對改頁面進行redo和undo
2-把redo和undo完畢的頁面寫回數據庫
差異備份的缺點
文章列表
SQL Server差異備份的備份/還原原理
記住一點:差異備份是基于最后一次完整備份的差異,而不是基于最后一次差異的差異
備份過程:
1-完整備份之后有無對數據庫做過修改,如果有,記錄數據庫的最后LSN(Last LSN)
1-完整備份之后有無對數據庫做過修改,如果有,記錄數據庫的最后LSN(Last LSN)
如果完整備份之后無對數據庫做過修改,那么差異備份就沒有意義了
2-做差異備份時根據差異位圖讀取差異頁面內容
注意:差異位圖記錄了自從最后一次完整備份以來數據庫中有變化的頁面,這樣在做差異備份時候就不用掃全庫頁面,只需要讀取有差異的頁面
3-在備份之前,數據庫會做一次檢查點,備份時把最后一次檢查點的LSN記錄進去備份文件
4-把最后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 |
全站熱搜
留言列表