数据库设置的默认恢复模式。在大多数情况下,这会意味着对于数据库的“默认”恢复模式是完整,但SQL Server的不同版本,对于model数据库会有不同的默认配置。
?
探索恢复模式
?
理论上,我们可以使用下列查询找出数据库使用的模式。
?
1 SELECT ? name ,
2 ? ? ? ? ?recovery_model_desc
3 FROM ? ? sys.databases
4 WHERE ? ?name = 'TestDB' ;
5 GO
但是,对这个查询要小心,因为它可能没告诉真相。例如,如果我们创建一个新的数据库,然后立即运行刚才的命令。它会报告这个数据库运行在完整恢复模式下。但事实上,直到完整备份已完成前,数据库会运行在自动-截断模式(即简单模式)。
?
我们可以在SQL Server实例上创建一个新的数据库来验证这个,默认的恢复模式是完整。我们创建有一些测试数据的表,然后检查下恢复模式。
?
?
?1 /* STEP 1: CREATE THE DATABASE*/
?2 USE master ;
?3?
?4 IF EXISTS ( SELECT ?name
?5 ? ? ? ? ? ? FROM ? ?sys.databases
?6 ? ? ? ? ? ? WHERE ? name = 'TestDB' )?
?7 ? ? DROP DATABASE TestDB ;
?8?
?9 CREATE DATABASE TestDB ON
10 (
11 ? NAME = TestDB_dat,
12 ? FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\TestDB.mdf'
13 ) LOG ON
14 (
15 ? NAME = TestDB_log,
16 ? FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\TestDB.ldf'
17 ) ;
18?
19 /*STEP 2: INSERT A MILLION ROWS INTO A TABLE*/
20 USE TestDB
21 GO
22 IF OBJECT_ID('dbo.LogTest', 'U') IS NOT NULL?
23 ? ? DROP TABLE dbo.LogTest ;
24 SELECT TOP 1000000
25 ? SomeID = IDENTITY( INT,1,1 ),
26 ? SomeInt = ABS(CHECKSUM(NEWID())) % 50000 + 1 ,
27 ? SomeLetters2 = CHAR(ABS(CHECKSUM(NEWID())) % 26 + 65)
28 ? + CHAR(ABS(CHECKSUM(NEWID())) % 26 + 65) ,
29 ? SomeMoney = CAST(ABS(CHECKSUM(NEWID())) %?
30 ? ? ? ? ? ? ? ? ? ? ?10000 / 100.0 AS MONEY) ,
31 ? SomeDate = CAST(RAND(CHECKSUM(NEWID()))
32 ? ? ? ? ? ? ? ? ? ?* 3653.0 + 36524.0 AS DATETIME) ,
33 ? SomeHex12 = RIGHT(NEWID(), 12)
34 INTO ? ?dbo.LogTest
35 FROM ? ?sys.all_columns ac1
36 ? ? ? ? CROSS JOIN sys.all_columns ac2 ;
37?
38 SELECT ? name ,
39 ? ? ? ? ?recovery_model_desc
40 FROM ? ? sys.databases
41 WHERE ? ?name = 'TestDB' ;
42 GO
?
?
?
这表示我们运行在完整恢复模式,但现在我们检查下日式空间使用
?
1 DBCC SQLPERF(LOGSPACE) ;
2 -- DBCC SQLPERF reports a 110 MB log file about 90% full3?
?
强制一个检查点(CHECKPOINT),再次检查日志使用率。
?
1 CHECKPOINT
2 GO
3?
4 DBCC SQLPERF(LOGSPACE) ;
5 -- DBCC SQLPERF reports a 100 MB log file about 60% full
?
注意日志文件近乎一样的大小,但是现在只有61.9%满;日志已被截断,空间可以被重用。虽然数据库被指定为完整恢复模式,实际上这个不应该操作直到第一次完整备份发生后。很有意思,这表示我们可以通过强制检查点(CHECKPOINT),而不是运行TestDB数据库的完整备份。完整备份操作操作触发了检查点(CHECKPOINT),且日志被截断。
?
为了确定数据库运行在哪个模式里,执行下列查询:
?
1 SELECT ? db_name(database_id) AS 'DatabaseName' ,
2 ? ? ? ? ?last_log_backup_lsn
3 FROM ? ? master.sys.database_recovery_status
4 WHERE ? ?database_id = db_id('TestDB') ;
5 GO
?
如果NULL值出现在last_log_backup_lsn列里,那么数据库实际上运行在自动截断模式,因此当数据库检查点发生时会截断。已经进行了完整数据库备份,你会发现那列会填上备份操作记录的日志记录的LSN,在这时,数据库菜真正运行在完整恢复模式。从这一刻开始,完整数据库备份不会在事务日志上影响;唯一截断日志的方法是备份日志。
?
切换模式
如果你曾从完整或大容量日志模式切换到简单模式,这会中断日志链,你只能恢复数据库到在你切换前,上一次日志备份的时间点。因此,不建议在切换前马上进行日志备份。如果你马上从简单模式切换到完整或大容量日志模式,记住数据库实际上会继续运行在自动截断模式(刚才显示的NULL值),直到你进行了另一个完整备份。
?
如果你从完整切换到大容量日志,那这不会中断日志链。但是在大容量模式里发生的任何大容量操作不会在事务日志里完整记录,因此不能在操作上控制,同样的方法里完整记录可以。这表示恢复数据到包含大容量操作事务日志里的时间点是不可能的。你只能恢复到日志文件尾。为了“重新启用”到时间点的恢复,在大容量操作完成后切换回完整模式,并立即进行一次日志备份。
?
备份的自动化和验证
即席数据库和事务日志备份可以通过SSMS里简单的T-SQL脚本进行。但是对于生产系统,DBA需要这些备份的自动化方法,还有验证备份的有效,可以用于还原你的数据。
?
这个话题的详细讲解已经不是这个系列文章的范围,但会在下面列出一些可用选项。由于SSMMS维护计划的一些问题,大多数DB会选择自己写脚本,然后用作业自动运行它们。
?
SSMS维护计划向导和设计器——SSMS内建的2个工具,允