一.概述 前面介紹了簡單恢復模式和大容量恢復模式,這篇繼續寫完整恢復模式下的備份與還原。在完整恢復模式里最大的優點是只要能成功備份尾日誌,就可以還原到日誌備份內包含的任何時點("時點恢復")。當然對比前二種模式它是犧牲了磁碟I/O性能。 恢復模式 備份策略 數據安全性 I/O性能 簡單恢復 完整備份 ...
一.概述
前面介紹了簡單恢復模式和大容量恢復模式,這篇繼續寫完整恢復模式下的備份與還原。在完整恢復模式里最大的優點是只要能成功備份尾日誌,就可以還原到日誌備份內包含的任何時點("時點恢復")。當然對比前二種模式它是犧牲了磁碟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
上面還原成功,證明瞭完整恢復模式切換到大容量模式,日誌鏈是不會中斷。