制为DBO或 SA之类的特权用户。如果在组织中有多个DBO用户,RESTRICTED_USER将
不会阻止他们连接到数据库。RESTRICTED_USER也不会阻止打开多个窗口以及多个对您试图 还原的数据库的连接,从而阻止了还原进行。ManagementStudio中的每个査询窗口以及“对象 资源管理器”使用的都是自己的连接。要确保还原操作成功,把数据库设置为SINGLE_USER 访问会容易得多。但讽刺的是,要 把 数 据 库 从 MULTIUSER改 为 SINGLEJJSER或 RESTRICTED_USER,必须独占访问该数据库,这与SINGLE_USER是等价的。2 .捕捉最近活动备份日志的结尾确保了最近(自最近一次备份以来)的事务被记录下来,并且可以恢复。 通常来说,这不是一个可选的步骤,只有尾日志备份完成后,还原操作才允许进行。3 .搜集备份信息如果整个数据库服务器没有出现故障,则这个最后一项操作可以变得非常简单。SQL Server在 m sdb数据库中记录所有的数据库备份和还原历史记录。要 査 看 SQL Server Management Studio认为需要还原的备份有哪些,可以在“对象资源管理器”中右击“数据 库”节点,选 择 “还原数据库”命令,然后在“还原的源”数据库下拉列表中选择要还原 的数据库。Management Studio将自动选择备份进行还原,如图9-9所示。记住这针对的是 一个完整还原。如果是还原一个文件或文件组,Management Studio就没有用武之地了。它 会列出所有执行过的文件和文件组备份,但不会选择其中某个文件或文件组备份进行还原。 必须手动执行这项工作。同样,如 果 Management Studio做出的选择不是您想要的,可以 覆盖它选定的备份。如果备份历史记录不可用,可 用 “源设备”选项选择一个文件或备份 设备,然后就可以选择合适的备份了。如前所述,备份媒体信息也可以使用3 个 RESTORE命令参数进行检索:RESTORE
HEADERONLY、RESTORE FILELISTONLY 和 RESTORE LABELONLY。9 .8 .5 还 原 用 户 数 据 库本章前面列出的备份策略主要应用于用户数据库。虽然系统数据库不需要备份,但备 份它们的策略也相当简单,通常局限于完整数据库备份。这是因为系统数据库并不经常改 动,并且其规模通常也较小。因此,本节讨论从之前定义的备份策略还原用户数据库的过程。1 .完整还原数据库的定期完整备份是所有备份策略中最简单的备份策略,也是一个非常简单的还 原策略。如果需要还原数据库,只要找到最近的完整备份,然后用它还原数据库即可。图 9-10显示了一个在上午9 点损坏的数据库。其最近的备份是在晚上12:02完成的。在这种 情况下,12:02的这个备份就恢复并还原。RESTORE DATABASE SmallWorks FROM DISK = 'E:\SQLBackups\SmallWorksWed0002.BAK* WITH RECOVERY2 .完整还原+差异还原
差异还原要求完整备份在差异备份前应用。图 9-11显示了 SmallWorks数据库在星期 三上午9 点失败。因为有一个差异备份在星期三凌晨0:02完成,所以星期二的差异备份就 可以忽略。还原过程是首先还原星期一的完整备份,接着还原是星期三的差异备份。
RESTORE DATABASE SmallWorks FROM DISK =•E:\SQLBackups\SmallWorksFullMon0002.BAK'
WITH NORECOVERYRESTORE DATABASE SmallWorks FROM DISK = * E :\SQLBackups\SmallWorksDiffWed0002.BAK1 WITH RECOVERY3 .完整还原+事务日志还原与差异备份和还原过程一样,事务日志还原在应用之前也需要一个基准还原。图9-12 显示了一个下午3 点损坏的SmallWorks数据库。因为该数据库处于简单或大容量日志恢复 模式,所以可以备份事务日志的结尾以捕捉数据库的所有最近改动。使用这种方法时,几 乎不会有数据损失。尾日志备份在下午3J0完成。在这之后就可以执行还原过程,首先还 原星期一的完整备份,然后还原剩下的事务日志备份。BACKUP LOG SmallWorks TO DISK = *E:\SQLBackups\SmallWorksTailLogMonl510.BAK* WITH NO一TRUNCATE
RESTORE DATABASE SmallWorks FROM DISK =*E:\SQLBackups\SmallWorksFullMon0002.BAK’ WITH NORECOVERYRESTORE LOG SmallWorks FROM DISK = 1E :\SQLBackups\SmallWorksLogMon0900.BAK1 WITH NORECOVERYRESTORE LOG SmallWorksFROM DISK =*E :\SQLBackups\SmallW orksLogM onl202.BAK*WITH NORECOVERYRESTORE LOG SmallWorks FROM DISK = fE:\SQLBackups\SmallWorksTailLogMonl510.BAK* WITH RECOVERY4 .完整还原+差异还原+事务日志还原在同时使用差异备份和事务日志备份来捕捉对数据库做出的改动时,顺序十分重要。每一个差异备份都包含对数据库做出的改动,而这些改动在完整备份和差异备份完成的间
隙中被记录在了事务日志上。图9-B 显示了此行为。因为数据库在下午6 点被破坏,有一 个尾日志备份捕捉了下午3 点〜下午6 点之间的所有活动。然后,这个数据库就使用完全 备份、差异备份、常规事务日志备份以及尾日志备份还原。BACKUP LOG SmallWorks TO DISK =*E:\SQLBackups\SmallWorksTailLogMonl810.BAK'
WITH NO_TRUNCATE, NORECOVERYRESTORE DATABASE SmallWorks FROM DISK =•E:\SQLBackups\SmallWorksFullMon0002.BAK1 WITH NORECOVERYRESTORE DATABASE SmallWorks FROM DISK =»E:\SQLBackups\SmallWorksDiffMonl202.BAK* WITH NORECOVERYRESTORE LOG SmallWorks FROM DISK =•E:\SQLBackups\SmallWorksLogMonl500.BAK* WITH NORECOVERYRESTORE LOG SmallWorks FROM DISK =*E:\SQLBackups\SmallWorksTailLogMonl810.BAK* WITH RECOVERY5 .文件和文件组还原文件和文件组还原过程会因为数据库的恢复模式以及文件或文件组是否标记为只读 而有所不同。如果数据库处于简单恢复模式中,那么可以独立于整个数据库还原的文件或 文件组是标记为只读的文件或文件组。由于数据库处于简单恢复模式中,尾日志备份是不 允许的,对任意只读文件或文件组的还原会导致该文件和文件组立刻为查询可用。独立文 件或文件组还原的语法和过程是相同的。文件还原示例1
这个例子显示的是当SmallWorks数据库被配置为完整恢复模式时,还原其中单个损坏 文件的过程。(1 )备份活动事务日志的结尾:
--Capture the tail of the transaction log BACKUP LOG SmallWorks TO DISK =•E:\SQLBackups\SmallWorksTailLog.BAK WITH INIT, NO_TRUNCATEz NORECOVERY(2 )还原损坏的数据文件:--Restore the damaged or corrupted file RESTORE DATABASE SmallWorks FILE ='SmallWorksDatal* 1 2 FROM DISK = 'E :\SQLBackups\SmallWorksFul1.BAK*此时,SmallWorksDatal文件是离线的,任何引用dbo.Contact表(它位于SmallWoricsDatal 文件中)的査询都会失败。(3 )还原日志的结尾,将 SmallWorksDatal文件返回至在线状态:试一试--Restore the tail of the log to bring the SmallWorksDatal file online RESTORE LOG SmallWorks FROM DISK =•E:\SQLBackups\SmallWorksTailLog.BAK'WITH RECOVERY文件还原示例2
这个例子显示了还原一个处于只读文件组中的被损坏数据文件的过程。在这个例子 中,没有必要捕捉日志的结尾并还原结尾以使文件在线。这是因为该文件位于只读文件组 中,没有任何改动需要捕捉。--Restore the damaged or corrupted file RESTORE DATABASE SmallWorks FILE = 1SmallWorksData2 FROM DISK = •E:\SQLBackups\SmallWorksFull.BAK1一旦 SmallWorksData2文件还原完成,数据库就完全在线并可以访问了。6 .部分还原部分还原的过程与文件/文件组的还原过程很相似。最大的区别在于部分还原总是包含 主文件组。部分还原示例1
下面的例子显示了如何使用部分备份来备份SmallWorks数据库,然后在SWUserDatal READWRITE文件组和主文件组失败之后进行还原以使数据库再次在线。(1) 执行部分备份:BACKUP DATABASE SmallWorks READ_WRITE_FILEGROUPS TO DISK = *E:\SQLBackups\SmallWorksFull.BAK1 WITH INIT(2) 一段时间之后,配置为READ_WRITE的文件组(包括主文件组)失败。失败后的第一步是捕捉最近的所有活动,并把数据库置于从失败恢复的状态中:
BACKUP LOG SmallWorks TO DISK = *E:\SQLBackups\SmallWorksTailLog.BAK* WITH INIT, NORECOVERY, NO_TRUNCATE(3 )还原配置为READ_WRITE的文件组。在 SmallWorks数据库中,就是主文件组和 SWUserDatal 文件组:RESTORE DATABASE SmallWorks FROM DISK ='E:\SQLBackups\SmallWorksFull.BAK' WITH PARTIAL, NORECOVERY(4) 还原日志的结尾并使数据库在线。RESTORE LOG SmallWorks FROM DISK = 1E :\SQLBackups\SmallWorksTailLog.BAK'WITH RECOVERY(5) 虽然数据库在线,但是因为正在还原主文件组,所以用户定义的文件组仍然是不 可访问的。要使用户定义的文件组在线,可以使用RESTORE DATABASE命令,但不指定 还原的源。这会为文件组瞬间完成恢复过程,因为实际上并没有数据被还原。RESTORE DATABASE SmallWorks FILEGROUP =•SWUserDatal• WITH RECOVERYRESTORE DATABASE SmallWorks FILEGROUP = *SWUserData21 WITH RECOVERYSmallWorks数据库现在就完全在线了。部分还原示例2
在这个例子中,只有SWUserdatal这个READ_WRITE文件组被损坏,所以没有必要 还原主文件组。(1 )再次从SmallWorks数据库的一个部分备份开始:BACKUP DATABASE SmallWorks READ_WRITE_FILEGROUPS TO DISK =*E:\SQLBackups\SmallWorksFull.BAK* WITH INIT(2) 一段时间之后,SWUserDatal文件组中的文件被破坏。在发现之后,可以捕捉事 务日志的结尾,并使数据库支持恢复。BACKUP LOG SmallWorks TO DISK = 1E :\SQLBackups\SmalIWorksTailLog.BAK'WITH INIT, NORECOVERY, NO_TRUNCATE(3 )只还原SWUserDatal文件组,然后还原日志的结尾使数据库完全在线。RESTORE DATABASE SmallWorks FILEGROUP = *SWUserDatal, FROM DISK =*E:\SQLBackups\SmallWorksFull.BAK*WITH NORECOVERY
RESTORE LOG SmallWorks FROM DISK = *E :\SQLBackups\SmallWorksTailLog.BAK* WITH RECOVERY7 .时间点还原SQL Server 2008支持将数据库和事务日志恢复到一个特定的时间点,但是前提是数据 库被配置为完整或大容量日志恢复模式。如前所述,大容量日志恢复模式应只用作完整恢 复模式的一个附加模式,因为大容量日志恢复模式对时间点还原有影响。如果数据库被配 置为大容量日志恢复,并且事务日志包含大容量操作,时间点还原是不可能的;事务曰志 必须完整还原。时间点数据库还原操作可以把-个数据库还原到由恶意或意外修改数据导致的数据 损坏之前的状态。例如,对 SmallWorks数据库的一个意外更新发生在下午3:00,但直到下 午 6:15才被检测到。一个已计划的数据库备份在下午4:00完成,一个已计划的事务日志 备份发生在下午5:00。要把数据库还原到刚好在这次意外更新之前,需要使用时间点还原。 还原数据库的事件的顺序如下所示:RESTORE DATABASE SmallWorks FROM DISK = ,E:\SQLBackups\SmallWorksFulll600.BAK, WITH STOPAT =»12/05/2008 14:59:00*,NORECOVERYRESTORE LOG SmallWorks FROM DISK = 'E :\SQLBackups\SmallWorksLogl700.BAK' WITH STOPAT =*12/05/2008 14:59:00',RECOVERY