为了继续讲解
SQL Server 2005中灾难恢复场景的系列(
SQL Server 2005中的灾难恢复程序部分一
,SQL Server 2005中的灾难恢复程序部分二(分离临界对象)、QL Server 2005中的灾难恢复程序部分三(使用分区表和多个文件组来实现高可用性))
,让我们来看看其他可以增加你的高度危急数据库可用性的方法
。某些情况下,你的大型数据库可能会损坏
。这可能是由有故障的硬盘驱动器或者控制器造成的,或者有时候是由在SQL Server机器上运行的错误配置的反病毒软件造成的。你确实需要运行一个全数据库备份来得到损坏的数据。但是如果只有一些页破坏了,那么你可能不想恢复整个数据库。SQL Server 2005引进了页级别恢复的概念。这将为你提供恢复一个或者多个损坏页而不用恢复整个数据库的选择。在
企业级版本中,当条件允许时,页恢复是联机执行的,这意味着可以为你的数据库实现高可用性。
让我们看看在一个损坏的数据库中如何使用页级别恢复。在这篇文章中,我仍然会使用Northwind数据库 – 除了我使用的这个数据库版本是损坏的。要注意的是,在你的生产环境中产生一个损坏的数据库不是那么容易的事情,所以你可能需要自己创建一个损坏数据库来测试这些程序。我所作的是使用一个十六进制编辑器来更改数据库文件的值。这将会在数据库文件中引入不一致从而导致它损坏。你可能需要做一些反复试验来获得一个特定的损坏页。在我的例子中,我选择损坏一个影响OrdersOrders表的数据页,因为这样很容易找到表内记录的文本值(相对于我在之前例子中使用的从十六进制编辑器中得到的Order Details表,这张表主要包括数字数据)。
即使在Northwind数据库中检测到损坏的页,在损坏的Orders表中运行一个查询也会返回分区结果。观察Results表,这看起来好像说,这个损坏的记录属于行号为673(原始的Orders表包括830条记录)。
在我的例子中,从错误信息可以看到,文件1的第265页是不能访问的。
让我们运行DBCC CHECKDB命令来检查Northwind数据库中所有对象的完整性。结果完全证实了数据库的页265 – Orders表是不能处理的。
现在,如果这是一个非常大型的数据库,那么你可能不只是恢复全数据库备份。这可能会导致在它恢复的时候你的数据库不能访问, 而那是你最不想做的事,尤其是只有一些页损坏了。注意,即使在数据库中有损坏页,其它所有的对象仍然能够访问,而我们也想保持以那种方式保存它。在这种情况下,我们只能使用SQL Server 2005中的页级别恢复选项。要做到这些,我们可以指定文件和页号,我们可以从RESTORE DATABASE命令的DBCC CHECK命令中得到这些号码。
USE master
GO
RESTORE DATABASE Northwind
PAGE = '1:265'
FROM DISK = N'D:DBBackupNorthwindBackup.bak'
GO
如果你的数据库包含多于一个的损坏页,那么仅需要在PAGE参数中相应增加文件和页并且用逗号隔开。假设你使用的备份是有效的并且饱含损坏页的副本,那么你可以使用全、文件或者文件组备份来做页恢复。在这个例子中,我仅仅使用一个全数据库备份来展示如何使用页级别恢复选项。这个恢复过程仅取代了在RESTORE DATABASE命令所指定的页。注意由RESTORE DATABASE命令返回的信息提示我们接下来该做什么。一如往常,我们备份日志的结束部分来完成前滚过程。
BACKUP LOG Northwind
TO DISK = N'D:DBBackupNorthwind_log.TRN'
WITH INIT, NO_TRUNCATE,
STATS = 10
GO
最后,我们恢复作为恢复过程的一部分的日志结束部分来使数据库重新联机。
RESTO