sqlservr.exe -m
(2) 如果服务器支持SQL Server的多个实例,要确定启动了正确的实例。SQL Server 的默汄实例位于\Program FilesXMicrosoft SQL Server\ MSSQL.l \MSSQL\Binn 文件夹中。每 一个额外的实例都有自己的MSSQL.x文件夹,但排序根据的是它们的安装顺序,所以这 些文件夹可能不是按照数字顺序排列的。(3) —旦以单用户模式启动了服务器,就可以还原master数据库了。要完成这一操作, 需要启动另一个命令提示窗口,使用SQLCMD登录SQL Server实例。下面的例子显示了 一个使用 Windows Security (-E)登录到 AughtEight (-S) SQL Server 实例的命令:C:\>SQLCMD -S AughtEight -E提示:要获得SQLCMD语法的完整描述,可参考SQL Server 2008联机丛书中的“使用sqlcmd 实用工具”主题。(4)成功登录服务器之后,可使用普通的RESTORE语法完成master数据库的还原:1>RESTORE DATABASE MASTER FROM DISK ='E:\SQLBackups\MasterFull.BAK * 2>G0Processed 360 pages for database 'Master1, file 'master1 on file 1. Processed 2 pages for database ’Master*, file *mastlog* on file 1.The master database has been successfully restored. Shutting down SQL Server.SQL Server is terminating this process.如前例所示, -旦还原了 master数据库,SQL Server会自动关闭该实例,这样就可以 用新还原的master数据库重启实例。 可在单用户模式下还原的数据库只有master数据库。还原了 master数据库后,就可以 重启SQLServer,继续还原其他系统或用户数据库。 如果SQL Server实例由于master数据库或整体服务器出现故障而不可访问,那么就需 要重建master数据库。在 SQL Server的之前版本中,可以通过一个命令提示实用工具完成 这个任务。但 是 Microsoft不再支持这个实用工具。所以要重建master数据库,就必须重 新安装SQL Server。重新安装完成之后,就可以使用master数据库的最新备份来还原服务 器,过程和前面所说的一样。当成功还原master数据库并重启SQL Server实例以后,剩下来的系统数据库和用户数 据库会被自动重新装载。如果master数据库的备份不是最新的或根本不存在,那么剩下的 系统和用户数据库就不会被自动重新装载,必须还原或附加它们。假设在文件系统中剩下 的数据库文件还是未被改动的,那么附加这些数据库会较快也较简单。附加现有数据库最 简单的方式是使用SQL Server Management Studio中提供的图形化工具。(1) 要附加一个数据库,右 击 “数据库”文件夹并选择“附加”命令,此 时 “附加数 据库”窗口将会显示。(2) 单击“添加”按钮浏览至数据库的MDF文件的位置,然后选择该文件。每个数据 库 的 MDF文件包含的元数据标识了数据库的所有组成文件的位置。只要没有文件被“未找到”消息标记,附加该数据库就没有任何困难。
(3)如果有一个数据文件丢失,那么将无法附加数据库。但是如果只是丢失了事务日 志文件,数据库仍然可以成功附加,只要选中丢失的日志文件,然后单击“删除”按钮即 可。一旦将日志文件从列表中删除,就可以单击“确定”按钮附加数据库。SQLServer将 使用原来的元数据重新创建一个日志文件。2 .孤立的用户在还原或附加master数据库和所有其他数据库之后,有必要检査用户数据库中是否有 孤立的用户。如果一个SQL Server登录名被添加到master数据库并被授予访问数据库的权 限,但是master数据库的备份在该登录名创建之前就已经执行,那么这时候就会出现孤立 的用户。当附加或还原用户数据库时,用户数据库包含该数据库用户,但是master数据库 中的登录名并不存在。要找到并修复孤立的用户,有两种方法可用。第一种是使用ALTER USER命令。假设 用户FredF是孤立的,下列代码可以将数据库用户与服务器登录名相关联:USE SmallW orks GOALTER USER FredF WITH LOGIN =FredF第二种方法是使用已弃用的sp change users login存储过程。输入参数@人比011定义了 sp change users login存储过程的3 个模式。表 9-3列出了该存储过程支持的3 种操作。9 .8 .7 数据库还原小结
和备份策略一样,有一个还原计划十分重要。一个好的还原计划应覆盖任何可能的失 败组合,并列出能在最短时间内以最小的数据损失还原数据库的步骤。我不可能在这里详 细介绍每一个可能的组合,所以需要您自己分析自己的基础设施,然后选择最适合自己的 环境的备份还原计划。9 .9 数据库快照如果数据库被完全损坏,那么数据库快照实际上是不能用来进行灾难恢复的。不过, 它可以用来逆转数据库修改造成的影响,也可以将査询从繁忙的事务数据库重定向到其他 地方。什么是数据库快照?快照是数据库在某个时间点的静态只读视图。快照的创建可以瞬 时完成,因为这个过程并没有真正复制作为快照源的数据库。相反,创建的数据文件只包 含源数据库中自快照创建之后改变过的数据页。此项功能叫做Copy On Write(写时复制)。 当最初创建数据库快照时,会创建几乎同样的数据文件来存放快照内容。这些数据文件的 区别在于,它们有与源数据库相独立的物理位置,而且在一开始只消耗很少磁盘空间。了解数据库快照的最简单的方法是创建并使用一个快照。下面的脚本创建了 Small Works数据库的--个快照:CREATE DATABASE SmallWorksSnapShot ON (NAME = * SmallWorksPrimary' , FILENAME = 'D:\SQLSnapShotData\SmallWorksPrimary.mdf*) ,(NAME = * SmallWorksdatal* , FILENAME = 1D:\SQLSnapShotData\SmallWorksDatal.ndf *) ,(NAME = 'SmallWorksdata2 * , FILENAME ='D:\SQLSnapShotData\SmallWorksData2.ndf*) AS SNAPSHOT OF SmallWorks观察文件系统,可以发现SmallWorks快照数据文件的大小是10MB,和创建时一样(由于 对 SmallWorks数据库所做的改动,您的文件大小可能会有所不同),但实际上它总共只占用 256KB空间,其中主文件占用128KB,每个辅助数据文件占用64KB。SQL Server保留了与数 据库现在正在使用的同样数量的磁盘空间,但只分配足够存储数据库结构的元数据的空间。现在看一下SmallWorks和 SmallWorksSnapShot数据库中的数据,了解当对源数据库 做出改动时,快照数据库和数据发生了什么情况。( 1 ) 首先编写一个査询,从 SmallWorks 和 SmallWorksSnapShot 数据库中的 dbo.Person 表的前三行返回一些数据,如下例所示:USE SmallWorks GOSELECT FirstName, LastName, EmailAddress FROM dbo.Person WHERE PersonlD < 4FirstName LastName EmailAddress
Ken Sanchez ken.sanchez@adventureworks.com Terri Duffy terri.duffy@adventureworks.com Roberto Tamburello roberto-tamburello@adventureworks.com(3 row(s) affected) USE SmallWorksSnapShotGOSELECT FirstName, LastName, EmailAddress FROM dbo. Person WHERE PersonlD < 4FirstName LastName EmailAddressKen Scinchez ken.sanchez@adventureworks.com Terri Duffy terri.duffy@adventureworks.com Roberto Tamburello roberto.tamburello@adventureworks.com(3 row<s) affected)可注意到,两个数据库返回了同样的结果。实际t , 对快照数据库的查询会被重定向 到源数据库,因为自从快照创建之后包含联系人信息的数据页就没有改变过。(2)现在,通过更改数据库中所有人的姓,更新源数据库中的数据。把它们全部更新, 这样就可以更简单地检查对保存快照数据库的物理数据文件的改动。USE SmallWorks GOUPDATE dbo.Person SET LastName = * Flintstone * (5000 row(s) affected)SmallWorksSnapShot文 件 现 在 占 用 1.2MB的空间(您的结果可能与此不同)。更新 SmallWorks数据 库 中 的 5000行导致包含这些行的数据页被复制到快照中,使得快照的大 小变大。(3)现在再次查询这两个数据库,看看结果如何。不出所料,源数据库改变了,反映 了 LastName列的更新。USE SmallWorks GOSELECT FirstName, LastName, EmailAddress FROM dbo.Person WHERE PersonlD < 4FirstName LastName EmailAddressKen Flintstone Terri Flintstone Roberto Flintstone
ken.s^nchez@adventureworks.com terri.duffyQadventureworks.com roberto.tamburello@adventureworks.com(3 row(s) affected)但是,快照数据库仍然反映的是数据在快照创建时的状态。这就是数据库的“静态只 读副本”的意思。USE SmallWorksSnapShot GOSELECT FirstName, LastName, EmailAddress FROM dbo.Person WHERE PersonlD < 4FirstName LastName EmailAddressKen S, anchez ken.sanchez@adventureworks.com Terri Duffy terri.duffy@adventureworks.com Roberto Tamburello roberto.tamburello@adventureworks.com(3 row(s) affected)可以根据需要创建数据库的多个快照,但要记住,每个额外的快照都会增加源数据库 的开销。因为每个更新或删除数据或对象的命令都会写入快照数据库,以记录数据库的前 一个版本。9 .9 .1 数据库快照限制数据库快照有一些限制,而快照的源数据库也有一些限制。• 数据库快照不能备份。因为快照是从源数据库中检索的数据和内部存储的数据的 组合,所以不可能真正备份快照。• 数据库快照不能修改。• 有快照存在时,不能删除源数据库。• 有快照存在时,不能将源数据库还原到快照创建之前的时间点。9 .9 .2 灾难恢复和数据库快照如何使数据库快照在灾难恢复中很好地发挥作用?这是个很好的问题。快照可以用来 撤消对源数据库的更新,因为它们有修改之前的数据的原副本。1 .撤消更新在上一个例子中,我们用姓Flintstone更新了 Person表中的5000行。要撤消这个更新 的影响,可以使用如下脚本:USE SmallWorks GO
UPDATE dbo.PersonSET LastName =S.LastNameFROM dbo.Person P JOIN SmallWorksSnapShot.dbo.Person S ON S.PersonlD =P.PersonlD现在,对源数据库的査询会显示所有的姓恢复为原来的值。2 .撤消删除考虑如下命令,它删除了 dbo.Person表中的50行:DELETE dbo.Person WHERE PersonlD < 51如果这是一个恶意或意外的更新,还原数据的一般模式是把数据库还原到一个测试服 务器,然后将数据从测试服务器复制到生产数据库。通过数据库快照,就不需要使用数据 库备份了。要还原数据,只需要从快照中选择数据,然后插入回源数据库表即可。U$E SmallWorks GOINSERT dbo.Person (PersonlD, FirstName, LastName, EmailAddress) SELECT PersonlD, FirstName, LastName, EmailAddress FROM SmallWorksSnapShot.dbo.Person WHERE PersonlD < 513 .撤消删除如果从源数据库中删除了一个数据库对象,那么可以为其编写脚本,并从快照数据库中 重新创建它。如果该对象是一个表,那么可以使用之前用于撤消删除的方法重新填充该表。--Inadvertant deletion of the Person table USE SmallWorks GODROP TABLE dbo.Person- - Recreate the Person TableUSE SmallWorks GOCREATE TABLE dbo.Person( PersonlD int NOT NULL, FirstName varchar(50) NOT NULL, MiddleName varchar(50) NULL, LastName varchar(50) NOT NULL, EmailAddress nvarchar (50) NULL ) ON SWUserDatal—-Repopulate the table INSERT dbo.Person (PersonlD, FirstName, LastName, EmailAddress) SELECT PersonlD, FirstName, LastName, EmailAddress FROM SmallWorksSnapShot.dbo.Person
4 .从快照还原如果源数据库遭到了一些不希望看到的改动,可以将快照指定为还原操作的源,把数 据库还原到快照创建时的状态。记住,如果存在多个快照,数据库就不能够被还原到快照 创建之前的时间点。首先必须删除那些快照。下面的命令演示了如何从一个数据库快照还 原 SmallWorks数据库:USE MASTERGORESTORE DATABASE SmallWorks FROM DATABASE_SNAPSHOT = 1SmallWorksSnapShot'9 .1 0 小结本章介绍了备份和还原数据库的不同方法,还介绍了灾难恢复的不同方面,这对于将 数据损失降到最低和保护工作十分重要。希望您已经明白了制定有效计划的重要性。数据 库管理员负责维护数据的完整性和安全性。要完成这项重要的任务,必须对灾难做出应对 计划,更重要的是要计划如何以最小的数据损失和最短的停机时间从灾难中恢复过来。