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