代码改变世界

9.8.6恢复系统数据库

2018-08-10 11:11  笑一笑十年少!!!  阅读(227)  评论(0编辑  收藏  举报


系统数据库和用户数据库一样容易发生故障,所以确保它们得到足够的保护十分重
要。一般来说,恢复系统数据库时有两种选择。可以从备份还原,或者从头重建它们。我
强烈推荐备份还原方法,因为从头重建意味着有人量的工作要做。
由于系统数据库通常很小,备份它们不需要很多时间,而且在备份后它们也不会占用
太大空间。系统数据库结构的改变频率决定了需要多久备份一次这些数据库,以最少化还
原后的工作。
1 .恢 复 master数据库
恢复master数据库有两种情况。第一种情况中,服务器是可以访问的。而第二种情况
中,SQL Server是不可访问的。
如果可以连接SQL Server,服务器实例就必须以单用户模式启动,以便还原和恢复
master数据库。
(1)要以单用户模式启动SQL Server的一个实例,需要在命令提示窗口中输入以下命令:

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>G0
Processed 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 GO
ALTER 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 GO
SELECT FirstName, LastName, EmailAddress FROM dbo.Person WHERE PersonlD < 4

FirstName 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 SmallWorksSnapShot
GO
SELECT FirstName, LastName, EmailAddress FROM dbo. Person WHERE PersonlD < 4
FirstName LastName EmailAddress
Ken 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 GO
UPDATE dbo.Person SET LastName = * Flintstone * (5000 row(s) affected)
SmallWorksSnapShot文 件 现 在 占 用 1.2MB的空间(您的结果可能与此不同)。更新 SmallWorks数据 库 中 的 5000行导致包含这些行的数据页被复制到快照中,使得快照的大 小变大。
(3)现在再次查询这两个数据库,看看结果如何。不出所料,源数据库改变了,反映
了 LastName列的更新。
USE SmallWorks GO
SELECT FirstName, LastName, EmailAddress FROM dbo.Person WHERE PersonlD < 4
FirstName LastName EmailAddress

Ken Flintstone Terri Flintstone Roberto Flintstone
ken.s^nchez@adventureworks.com terri.duffyQadventureworks.com roberto.tamburello@adventureworks.com
(3 row(s) affected)
但是,快照数据库仍然反映的是数据在快照创建时的状态。这就是数据库的“静态只
读副本”的意思。
USE SmallWorksSnapShot
GO
SELECT FirstName, LastName, EmailAddress FROM dbo.Person WHERE PersonlD < 4
FirstName LastName EmailAddress
Ken 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.Person
SET LastName =S.LastName
FROM 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 GO
INSERT dbo.Person (PersonlD, FirstName, LastName, EmailAddress) SELECT PersonlD, FirstName, LastName, EmailAddress FROM SmallWorksSnapShot.dbo.Person WHERE PersonlD < 51
3 .撤消删除
如果从源数据库中删除了一个数据库对象,那么可以为其编写脚本,并从快照数据库中
重新创建它。如果该对象是一个表,那么可以使用之前用于撤消删除的方法重新填充该表。
--Inadvertant deletion of the Person table USE SmallWorks GO
DROP TABLE dbo.Person
- - Recreate the Person Table
USE SmallWorks GO
CREATE 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 MASTER
GO
RESTORE DATABASE SmallWorks FROM DATABASE_SNAPSHOT = 1SmallWorksSnapShot'
9 .1 0 小结
本章介绍了备份和还原数据库的不同方法,还介绍了灾难恢复的不同方面,这对于将
数据损失降到最低和保护工作十分重要。希望您已经明白了制定有效计划的重要性。数据
库管理员负责维护数据的完整性和安全性。要完成这项重要的任务,必须对灾难做出应对
计划,更重要的是要计划如何以最小的数据损失和最短的停机时间从灾难中恢复过来。