記住一點:差異備份是基於最後一次完整備份的差異,而不是基於最後一次差異的差異
備份過程:
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
mysql的xtrabackup備份工具的原理其實也是差不多,讀取頁面,根據checkpointlsn和頁面的lsn比較進行備份和還原
所以lsn在資料庫的備份還原裡面起著重要作用
對於最後乙個lsn可以參考:
您真的理解了sqlserver的日誌鏈了嗎?
sqlserver全備份,差異備份和日誌備份
差異備份是以上乙個全備為基點,這個期間所有差異資料的備份。日誌備份是基於前乙個全備 日誌備份為基點,這個期間的事務日誌的備份。日誌備份用於確保還原資料庫到某個時間點 在利用全備 日誌備份時,需要有序並逐個還原所有日誌備份。假設要還原週六的資料,則需要上週日的全備和周一到週六的所有日誌備份才可以。如果...
差異備份 SQL Server
對於唯讀資料庫,單獨使用完整備份比同時使用完整備份和差異備份更容易管理。當資料庫為唯讀時,備份和其他操作無法更改檔案中包含的元資料。因此,差異備份所要求的元資料 如差異備份開始的日誌序列號,即差異基準 lsn 儲存在master資料庫中。如果在資料庫唯讀時採用的是差異基準,則差異位圖指示的更改多於在...
sqlserver 差異備份與還原示例
建立測試資料庫 create database test gouse test go 建立測試表 create table test id uniqueidentifier default newid summary varchar 200 完整備份資料庫 backup database test ...