?
SQL Server中的事务日志管理(5/9):完整恢复模式里的日志管理(三)
current set
21 RESTORE HEADERONLY
22 FROM DISK = 'C:\Backups\TestDB.bak'
23 GO
24
25 -- Back up the tail of the log to prepare for restore
26 -- This will become the third file of the bakup set
27 BACKUP Log TestDB
28 TO DISK = 'C:\Backups\TestDB.bak'
29 WITH NORECOVERY;
30 GO
31
32 -- Restore the full backup
33 RESTORE DATABASE TestDB
34 FROM DISK = 'C:\Backups\TestDB.bak'
35 WITH FILE=1, NORECOVERY;
36
37 -- Apply the transaction log backup
38 RESTORE LOG TestDB
39 FROM DISK = 'C:\Backups\TestDB.bak'
40 WITH FILE=2, NORECOVERY;
41
42 -- Apply the tail log backup
43 RESTORE LOG TestDB
44 FROM DISK = 'C:\Backups\TestDB.bak'
45 WITH FILE=3, NORECOVERY;
46
47 -- Recover the database
48 RESTORE DATABASE TestDB
49 WITH RECOVERY;
50 GO
?
(代码5.2:备份到,从备份集恢复,不推荐。)
?
但是,使用备份集看起来是数据库备份到磁带时留下的遗物。当备份到磁盘时,使用这个计划是个不好的想法,显然,备份文件会增长非常迅速。
?
实际上,常见的是每个完整备份和事务日志备份文件的每个文件名都不一样,都标记上备份发生的日期和时间。例如,大多数第三方备份工具,流行社区生成的脚本,加上SSMS里的维护计划向导/设计器,都会创建各个日期标记的文件,例如WIN8X64_AdventureWorks2008R2_FULL_20151025_120003.bak。
?
这样的话,更常见的备份和还原计划会使用唯一命名的备份,如下所示:
1 USE master; 2 BACKUP DATABASE TestDB 3 TO DISK ='C:\Backups\TestDB.bak' 4 WITH INIT; 5 GO 6 7 -- Perform a transaction log backup of the Test database 8 BACKUP Log TestDB 9 TO DISK ='C:\Backups\TestDB_log.bak' 10 WITH INIT; 11 GO 12 13 -- ........ 14 15 -- Back up the tail of the log to prepare for restore 16 BACKUP Log TestDB 17 TO DISK ='C:\Backups\TestDB_taillog.bak' 18 WITH NORECOVERY, INIT; 19 GO 20 21 -- Restore the full backup 22 RESTORE DATABASE TestDB 23 FROM DISK = 'C:\Backups\TestDB.bak' 24 WITH NORECOVERY; 25 26 -- Apply the transaction log backup 27 RESTORE LOG TestDB 28 FROM DISK = 'C:\Backups\TestDB_log.bak' 29 WITH NORECOVERY; 30 31 -- Apply the tail log backup 32 RESTORE LOG TestDB 33 FROM DISK = 'C:\Backups\TestDB_taillog.bak' 34 WITH NORECOVERY; 35 36 -- Recover the database 37 RESTORE DATABASE TestDB 38 WITH RECOVERY; 39 GO
(代码5.3:备份到,从唯一命名备份文件集还原)
?
恢复到上次正确日志备份的时间点
?
有时候很遗憾,不能进行完整恢复:例如由于灾难当前事务日志不可用。这样的话,我们会需要还原数据库导最近日志备份的末尾。我们要为这个可能做好准备,例如损坏的硬盘包含事务日志,这就决定了事务日志备份的频率。如果每15分钟备份一次,那么你就有丢失15分钟数据的风险。
?
假设我们已经进行了如下的一系列备份。为了演示需要,我们覆盖了先前的备份文件,实际的备份文件集明显比这个更短。
1 -- FULL BACKUP at 2AM 2 USE master ; 3 BACKUP DATABASE TestDB 4 TO DISK = 'C:\Backups\TestDB.bak' 5 WITH INIT ; 6 GO 7 8 -- LOG BACKUP 1 at 2.15 AM 9 USE master ; 10 BACKUP LOG TestDB 11 TO DISK = 'C:\Backups\TestDB_log.bak' 12 WITH INIT ; 13 GO 14 15 -- LOG BACKUP 2 at 2.30 AM 16 USE master ; 17 BACKUP LOG TestDB 18 TO DISK = 'C:\Backups\TestDB_log2.bak' 19 WITH INIT ; 20 GO
(代码5.4:一个简短序列的日志备份)
?
如果灾难性故障发生在上午2:30,我们将需要恢复数据库到上午2:30的尾日志备份状态。
?
在这个例子的恢复步骤和我们在代码5.3里看到的非常类似,但因为不能进行尾日志备份,我们只能恢复到特定点,我们要使用代码5.5里所显示的STOPAT选项。
1 --RESTORE Full backup 2 RESTORE DATABASE TestDB 3 FROM DISK = 'C:\Backups\TestDB.bak' 4 WITH NORECOVERY; 5 6 --RESTORE Log file 1 7 RESTORE LOG TestDB 8 FROM DISK = 'C:\Backups\TestDB_log.bak' 9 WITH NORECOVERY, STOPAT = 'Jan 01, 2020 12:00 AM'; 10 11 --RESTORE Log file 2 12 RESTORE LOG TestDB 13 FROM DISK = 'C:\Backups\TestDB_Log2.bak' 14 WITH NORECOVERY, STOPAT = 'Jan 01, 2020 12:00 AM'; 15 16 --Recover the database 17 RESTORE DATABASE TestDB 18 WITH RECOVERY; 19 GO
(代码5.5:使用STOPAT恢复到时间点)
?
因为我们在将来指定了STO