原文: sql server 備份與恢複系列三 簡單恢複模式下的備份與還原
一.概述
前面講了備份的一些理論知識,這篇開始講在簡單恢複模式下的備份與還原。在簡單模式下是不能做日志備份的,發生災難後,資料庫最後一次備份之後做的資料修改将是全部丢失的,是以在生産環境下,資料又很重要,一般不建議使用這種模式。 例如對一個資料庫有5次完整資料備份,時間是t5, 之後發生災難,就會部丢失。

當資料庫越來越大,完整備份時間會越來越長,為了減少丢失風險,引入差異備份。例如下圖示範:在第一次建立資料庫完整備份後,建立了三次差異備份,之後再建立完整備份,進而建立新的差異基準。不管是完整備份還是差異備份,一般隻能在晚間進行。如果資料比較龐大又不允許長時間資料丢失,那簡單恢複模式是不能滿足的。
二.備份示範
在簡單恢複模式下主要的備份是完整備份和差異備份。我這裡有TestLog庫,庫裡有二個表。假設周日做一次完整備份,周一到周六晚上每天做一次差異備份,到第二周的周日時開始新的基準線。如下所示
use test
exec sp_addumpdevice 'disk', 'BackupTestDevice','F:\SqlService\backup\BackupTestBackup.bak'
--設定恢複模式為簡單恢複
ALTER DATABASE TestLog SET RECOVERY simple
go
-- 做一次完整備份到備份裝置中(備份基準) 假設在周日晚上
backup database TestLog to BackupTestDevice
go
go
--差異備份 周一晚
backup database TestLog to BackupTestDevice with differential
go
--差異備份 周二晚
backup database TestLog to BackupTestDevice with differential
go
--差異備份 周三晚
backup database TestLog to BackupTestDevice with differential
go
--差異備份 周四晚
backup database TestLog to BackupTestDevice with differential
go
--差異備份 周五晚
backup database TestLog to BackupTestDevice with differential
go
--差異備份 周六晚
backup database TestLog to BackupTestDevice with differential
go
--完整備份 周日晚(新基準)
backup database TestLog to BackupTestDevice with differential
go
--差異備份 周一晚
backup database TestLog to BackupTestDevice with differential
在備份裝置中檢視備份集
-- 通過腳本檢視
select distinct s.first_lsn,s.last_lsn,s.database_backup_lsn,s.position,
s.backup_finish_date,s.type,y.physical_device_name,s.backup_size
from msdb..backupset as s inner join
msdb..backupfile as f on f.backup_set_id=s.backup_set_id inner join
msdb..backupmediaset as m on s.media_set_id=m.media_set_id inner join
msdb..backupmediafamily as y on m.media_set_id=y.media_set_id
where s.database_name='TestLog'
order by s.position asc
三. 還原示範
将一個資料庫還原,需要構造一個正确的還原順序。在還原過程中,備份檔案結尾使用norecovery事務不恢複(正在還原。。)不可讀寫,在最後一個備份檔案結尾使用recovery事務恢複。資料庫恢複正常。
-- 切換到master庫
use master
--設定單使用者模式(否則執行下面報錯:“因為資料庫正在使用,是以無法獲得對資料庫的獨占通路權”)
ALTER DATABASE TestLog SET OFFLINE WITH ROLLBACK IMMEDIATE
-- 從備份恢複一個全備份 ,norecovery(正在還原...)不可讀寫. file指備份集位置号
restore database TestLog from BackupTestDevice with file=1, norecovery
-- 恢複到差異備份檔案3,跳過差異備份2 ,看是否備份成功
restore database TestLog from BackupTestDevice with file=3, recovery
-- 備份結束之後,結束單使用者模式
ALTER database TestLog set online
下面在來示範還原差異檔案,使用舊基準。還原看會怎麼樣
-- 從舊基準中恢複一個全備份 ,norecovery(正在還原...)不可讀寫. file是1
restore database TestLog from BackupTestDevice with file=1, norecovery
--新基準file是8, 恢複到差異備份檔案9
restore database TestLog from BackupTestDevice with file=9, recovery
總結:對于簡單恢複模式,沒有日志備份,恢複隻需要一個完整資料庫備份,以及最後一個差異備份。 對于多個差異備份檔案,在還原時不需要LSN的連續性(在同一個基準内)。