sql server 備份與恢復系列五 完整模式下的備份與還原


一.概述

  前面介紹了簡單恢復模式和大容量恢復模式,這篇繼續寫完整恢復模式下的備份與還原。在完整恢復模式里最大的優點是只要能成功備份尾日志,就可以還原到日志備份內包含的任何時點("時點恢復")。當然對比前二種模式它是犧牲了磁盤I/O性能。

恢復模式

備份策略

數據安全性

I/O性能

簡單恢復

完整備份+差異備份

安全最差。最后一次備份之后,所有數據操作丟失。

最優

大容量恢復

完整備份+差異備份+日志備份

折中。批量操作有丟失風險。尾日志備份失敗。最后一次備份之后,所有數據操作丟失

折中

完整恢復

完整備份+差異備份+日志備份

相比上面二種最安全。尾日志備份失敗。最后一次備份之后,所有數據操作丟失

最差

  在完整恢復模式下,最常見的備份策略,如下圖所示:

二. 備份

  在前章中講到了大容量恢復模式下的備份。備份策略與大容量模式是一樣的,同樣是完整備份+差異備份+日志備份。這里要突出點是:當誤操作發生后,如何還原到誤操作之前的一分鍾,找出誤操作之前的數據。
在"sql server 日志文件結構及誤操作數據找回"中有介紹誤操作數據找回,但是基於第三方工具ApexSQL Log。雖然該工具方便,但要收費喲。

  我這里有一個BackupTest庫,庫里有個Employees表

use master
--設置完全模式
ALTER DATABASE BackupTest SET  RECOVERY FULL  
--創建備份設備(有就不要執行)
use master
exec sp_addumpdevice 'disk', 'BackupTestDevice','F:\SqlService\backup\BackupTestBackup.bak'
go
--做一次完整備份到備份設備中(備份基准)
backup database  BackupTest to BackupTestDevice

--新增數據
insert BackupTest.dbo.Employees values('湖南長沙')
insert BackupTest.dbo.Employees values('湖南湘潭')
--日志備份
backup log BackupTest to BackupTestDevice

 備份集如下所示:

-- 誤操作發生, 忘記加where條件,操作時間是:2018-8-12 10:55  
delete from BackupTest.dbo.Employees 

三.還原(1)

  當誤操作發生后,是需要找管理員來進行數據還原。 如果數據庫太大,還原是需要很長時間(注意使用副本,不要使用生產庫)。 這種情況下就需要等待了。 避免的方法:(1)是做sql審核,不在Managemnet studio里直接操作,避免此類事情發生.(2)是使用粒度更小的備份方式,但相應的復雜些。

--步驟1 備份尾日志
use master
go
backup log BackupTest to BackupTestDevice with norecovery 

go
--步驟2 從備份恢復一個全備份 ,norecovery(正在還原...)不可讀寫. file指備份集位置號
restore database BackupTest from BackupTestDevice with file=19, norecovery --事務不恢復

--步驟3 
restore log BackupTest from BackupTestDevice  with file=20,  norecovery --事務不恢復

--步驟4 用stopat恢復到10:54
restore log BackupTest from BackupTestDevice  with file=21, stopat='2018/8/12 10:54', recovery --事務恢復
--數據又回來了
select * from  BackupTest.dbo.Employees 

  

四.還原(2)

  在前面介紹中,有講過,完整恢復模式切換到大容量模式,日志鏈是不會中斷。下面來驗證

--從完整恢復模式切換到大容量模式
ALTER DATABASE BackupTest SET  RECOVERY bulk_logged 
-- 新增
insert BackupTest.dbo.Employees values('湖南株洲')
--日志備份
backup log BackupTest to BackupTestDevice
-- 刪除
delete from BackupTest.dbo.Employees 
-- 尾日志
backup log BackupTest to BackupTestDevice with norecovery 

 備份集如下所示,日志文件ID:22是在大容量模式下備份的,23是尾日志

restore database BackupTest from BackupTestDevice with file=19, norecovery --事務不恢復
restore log BackupTest from BackupTestDevice  with file=20,  norecovery --事務不恢復
restore log BackupTest from BackupTestDevice  with file=21,  norecovery --事務不恢復
restore log BackupTest from BackupTestDevice  with file=22,  recovery 

  當日志還原到文件ID:22時,報錯,如下圖所示

   跳過文件ID:22, 使用23來提交事務,也會報錯,如下所示:

restore log BackupTest from BackupTestDevice  with file=23,  recovery

   經過測試,還原失敗,錯誤是指:與上一次還原到指定時間點有關系。

  下面在測試一個新庫TestFULLToBulk

--設置完全模式
ALTER DATABASE TestFULLToBulk SET  RECOVERY FULL  
--做一次完整備份到備份設備中(備份基准)
backup database  TestFULLToBulk to BackupTestDevice
insert TestFULLToBulk.dbo.product values('湖南株洲')
--日志備份
backup log TestFULLToBulk to BackupTestDevice
--設置大容量
ALTER DATABASE TestFULLToBulk SET RECOVERY bulk_logged   

insert TestFULLToBulk.dbo.product values('湖南湘潭')
--日志備份
backup log TestFULLToBulk to BackupTestDevice

  備份集如下:文件ID28是在大容量下進行的備份

  

backup log TestFULLToBulk to BackupTestDevice with norecovery 
go
restore database TestFULLToBulk from BackupTestDevice with file=26, norecovery 
go
restore log TestFULLToBulk from BackupTestDevice  with file=27,  norecovery 
go
restore log TestFULLToBulk from BackupTestDevice  with file=28,  recovery 

  上面還原成功,證明了完整恢復模式切換到大容量模式,日志鏈是不會中斷。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM