编辑:Nancy Michell

防止重新启动

问:将修补程序和类似程序应用到 SQL Server 甚至是更普遍意义的服务器操作系统时,如何限制重新启动的次数?

答:首先,您可能有兴趣知道大部分安装后的重新启动并没有硬编码到安装程序中。它们通常是锁定文件导致的结果。也就是说,安装程序会试图更新一些当前被其他应用程序或操作系统在使用的(锁定的)文件。有一种直接的办法可消除这些重新启动,就是确保没有进程正在使用上述的文件。怎么办呢?

首先是确定安装期间被使用或锁定的具体文件。最简单的方法就是在注册表 HKLM\system\currentcontrolset\control\sessionmanager\pendingfilerenameoperations 中查找它们。查看该注册表项有两个目的:通过它可确认重新启动请求确实是由锁定文件引起的,并且它会告知您哪些文件被锁定。如果您在安装后、重新启动之前查找这些文件,您就可能找出导致重新启动的原因,并在将来的安装过程中采取措施来消除重新启动。

您可能会发现两种类型的条目。如果某个文件被读锁定,您将看见每文件一行形式的条目,表示更新的文件已存在于磁盘上,不过您需要清除仍在使用的临时副本。如果文件被写锁定,您将看见每文件两行形式的条目,表示更新尚未发生,应用程序处于未知状态,尚不可以使用。应用程序就像是停留在安装过程中。若是如此,一行代表实际文件,另一行指向临时文件(将在重新启动后变成实际文件)。

下一步骤取决于多种因素,不过中心就是确定当前在使用锁定文件的软件。请使用依赖关系检查程序(如果条件许可)或者 MSDN® 上的 DLL HELP 数据库(参阅 support.microsoft.com/kb/815065)。

如果您识别的软件有一项服务,请手动停止该服务后再进行测试。如果是应用程序,则将其关闭,然后再试。有时会是多个应用程序在同时使用同一个文件,则需要停止所有的这些程序。

这些测试(在您的测试环境中)的结果就是安装前要在生产环境中停止的应用程序以及服务的列表。从而生产环境将不会要求重新启动,因为没有什么软件将会锁定安装程序正在安装的文件。当然,别忘了在安装完成后重新启动那些应用程序与服务。

让人高兴的是这些锁定通常不会有多大变化。因此,您只要对您的系统成功进行过一次这样的操作,就可能能够在系统的整个生存期内避免许多次的重新启动。

还有一个技巧值得一提。您可能同时安装了多个版本的 SQL Server™ 或其他的产品,且它们可能甚至属于不同的版本级别。您应总是首先更新最新版本。大多数情况下,更新将用最新版本替换一切,从而所有其他实例将不用关心是否有锁定。例如,如果您有三个 SQL Server 2000 SP3 实例,您升级到 SP4 的第一个实例将会升级 MSXML3.dll 文件且需要重新启动。假定您执行了重新启动。然后,您就可以将后两个实例升级到 SP4 而无需重新启动,因为更新的 MSXML3.dll 文件已经存在。对于在升级 SQL Server 2000 实例之前升级任何 SQL Server 2005 实例以及在升级 SQL Server 7.0 实例之前升级 SQL Server 2000 来说同样如此。这是个确实行之有效的常规最少次数重新启动策略。

总体来说,Microsoft 开发团队做了许多的工作来停止或限制许多情况下的重新启动次数。既然本文是 SQL 问题与解答专栏,就让我们以 SQL Server 为例。

在 SQL Server 2005 中,SQL Server 团队将 SQL Server 必需的 Microsoft® 数据访问组件 (MDAC) 代码分离到 SQLNCLI(新文件)中以取代更新 MDAC 本身,并将 MDAC 移回与操作系统结合。这有什么用呢?Windows® 操作系统本身将使用 MDAC 并锁定这些文件。这就是大多数 SQL Server 服务包和其他包总是需要您重新启动的原因。现在,SQL Server 可以不触及操作系统使用中的 MDAC 文件来更新其 MDAC 版本,因此就不需要重新启动。

此外,现在还在 SQL Server 2005 SP1 安装程序中内置了一个依赖关系检查程序和中断。这可以向您显示被锁定的对象以及可能锁定该对象的程序或服务,从而您有机会当时就停止执行锁定的对象并继续安装,而无需重新启动。它意味着您可以实时解决该问题而不需要进行更多的测试。当然,如果您选择无人参与模式或者正在此模式下运行,则您总是可以选择继续并重新启动。只是您将注意到该功能对于找出锁定您的文件的对象是如此的简单!

此外,Microsoft Installer 技术还能够更有效地处理现有的 PendingFileRenameOperations (PFR)。您可能会想起,只要有文件出现在我们先前讨论过的注册表项中,SQL Server 2000 安装就将受阻。SQL Server 2005 安装很智能,只有在这些文件是属于 SQL Server 时(表示可能会有冲突)它才会受阻,甚至出现如是情况,它也经常能找到 PFR 项并直接进行更新而无需重新启动。MSI 和 update.exe 都不同程度的包含了该技术,它们是用于执行所有更新的现行标准的 Microsoft 安装程序。

哪些是已知会导致重新启动的因素呢?MSXML3.dll 是最主要的原因之一。该文件总是被 Windows SVCHost 服务锁定,因此任何包括该服务的程序都必须要重新启动。此外,该文件还存在于大部分的 MDAC 堆栈 (mdac_typ.exe) 中。幸好,MDAC“集成到”了 Windows Server® 2003 和 Windows XP SP2 及后续版本中。SQL Server 开发团队做了许多杰出的工作来分离 msxmlsql.dll,使得 SQL Server 更新不会导致重新启动,不过您暂时偶尔还是能看到这种情况发生。对于它,您无能为力 - 您不能关闭 SVCHost 而继续运行更新。

同样,update.exe 软件包的卸载过程有点古怪。如果卸载该程序,它将会锁定(当然,在 PFR 项外部)安装程序的预备文件。从而阻止其他 update.exe 软件包运行,直到您重新启动将锁定解除为止。实际上,您能做的就是要明白这一点并计划在卸载任何修补程序之后重新启动系统。

另一个问题是间断性。并非所有程序都会一直使用某一个文件。事实上,大部分共享 DLL 的使用都是以时间点的方式,也就是说其他程序会根据自身的工作负荷和代码路径只在需要时进行调用。这表示您有可能测试了 10 次都没发现被锁定的文件,而后在生产部署时却发现一个被锁定的文件。遗憾的是,我们没有什么神丹妙术。您只能尽可能地将测试环境构建得与您的生产环境一样,包括负载(无论如何是个不错的目标),并进行足够多次测试以发现这些因素。

操作系统服务包和升级将引起重新启动。请注意,对于低级版本(Windows 2000、Windows XP 和任何更早期的版本),必须在完成重新启动之后安装才算结束 — 即使 pendingfilerenameoperations 注册表项为空时也如此。在重新启动期间,系统可能会运行例外的软件包注册操作来安装代码。它们甚至不是服务包安装的一部分,而是嵌入在您的当前操作系统中的命令,它们受升级的触发,目的是允许您运行要用来保留它们的代码段。

最后,PFR 项不会执行文件版本检查,也不通过顺序化来强制排序。这意味着它将按文件的列出顺序开始文件替换。但是在硬盘上替换文件的顺序已被证实是到最后一个文件才完成(而不是从第一个文件开始的)。这一点毫无疑问,不过这意味着如果在同一路径中存在同一个文件的两个副本,而每个都指向不同的版本,则这将在重新启动后产生一个随机结果。如果您遇到这种情况,则必须将其修复。如果您不能确定,只需在重新启动后再次运行相关的两个安装程序。如果您取得了正确的文件,则二者均不会执行任何操作。如果您取得的是错误的文件,则具有正确文件的那个软件包就会将其修复。老实说,比起找出所需的结果到底是什么来说,这是更快更安全的方法。

多个服务包安装

问:我在 4 节点群集上有八个 SQL Server 2000 群集实例,并且只想以最少次数的重新启动来安装 SP4。我可以将 SP4 逐一安装到这 8 个实例上并在最后重新启动全部节点吗?

答:一旦您在给定的 Windows 服务器上(群集或非群集)完成了 SQL Server SP4 单个实例的安装 — 可能需要重新启动,则在该机器的任何其他 SQL Server 实例上安装 SQL Server SP4 时便不会再进行重新启动。原因是,所有共享文件(工具、MDAC 和 MSXML 等)均已是正确的版本,从而无论被锁定与否,均不需要再进一步更新。所有非共享文件只会由第一个实例使用,该实例将被安装程序关闭。值得注意的是,如果您有多个版本的多个实例,您应当首先更新最新的 SQL Server 实例。

作为 Network Service 运行

问:究竟什么是 NT AUTHORITY\NETWORK SERVICE 帐户,其主要用途是什么?此外,该帐户有什么安全含义,尤其是为其赋予系统管理员 (sa) 权限时?

答:Network Service 帐户与网络上的 System 具有相同的标识(计算机标识),但是它在本地机器上的权限更小。因此,如果某个服务要求访问网络资源,也许是使用域控制器解析帐户名称,则该服务必须作为 System、域帐户或 Network Service 运行。通常,Network Service 是最安全的选择,因为它的作用范围仅限于本地机器,而且即使在本地机器上的权限也受到进一步限制。

在 SQL Server 中让 Network Service 成为系统管理员意味着在本地机上作为 Network Service 运行的任何其他服务都拥有对整个服务器的完全控制。例如,当 SQL Server 服务帐户被配置为作为 Network Service 运行时,就会发生这种情况。使 SQL Server 服务帐户成为系统管理员的一员需要服务器功能(例如,允许环回连接)。尽管在 SQL Server 上使 Network Service 作为管理员运行并不是个很好的安全实践,但也许会(或也许不会)好于将域帐户用于该目的,而它要比将 SQL Server 作为 LocalSystem 运行安全得多。

如果您不想让 Network Service 具有系统管理员权限,下一个要探讨的选择就是将域帐户专门用于在 Windows NT® 的一个或多个安装上运行 SQL Server。

以下文章可提供一些帮助:msdn.microsoft.com/library/en-us/dnpag2/html/paght000009.aspmicrosoft.com/technet/security/topics/serversecurity/serviceaccount

创建多个数据库

问:我想要将数据划分到单独的数据库中,一次可能会多达 250 个在线数据库。我估计在任何给定时间将只有 20% 的数据库要用于主动查询。数据库是多点比少点好吗?

答:数据库服务器实例中的数据库数量应由业务需要和管理因素决定。在单个服务器实例中创建多个数据库并不需要多少开销,不过更多的数据库意味着执行维护任务(如备份和还原、镜像、用户帐户以及用户角色)方面的管理开销会更多。随之增加的管理复杂性可能会超出增加数据库所带来的益处。

通常的规则是在一个数据库中保存与某个应用有关的所有数据,从而从故障中恢复会更容易。如果某个应用的数据遍布多个数据库,则在故障转移期间必须恢复所有这些数据库。这会延迟恢复,而如果其中某个数据库不能恢复时,甚至会导致整个恢复失败。

也就是说,将数据分到多个数据库中有以下原因:

  • 数据子集与其他数据的备份要求不同。
  • 某些数据需要一个单独的安全环境,即一个不同的数据库所有者。
  • 有时,数据的存在是用于历史目的并且需要在只读模式下保存。

衷心感谢以下 Microsoft IT 专家为我们提供技术专业知识支持:Ramon Arjona、Frank De Waelle、Robert Djabarov、Herman Learmond-Criqui、Maxwell Myrick、Ruslan Ovechkin、Uttam Parui、Shashi Ramaka、Gary Roos、Gavin Sharpe、Vijay Sirohi、Jimmie Thompson 和 Madhusudhanan Vadlamaani。

编辑:Nancy Michell

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.