在使数据库在另一个服务器实例上可用时管理元数据 (SQL Server)

本主题在以下情况下相关:

  • 配置 Always On 可用性组的可用性副本。

  • 为数据库设置数据库镜像。

  • 准备在日志传送配置中更改主服务器和辅助服务器之间的角色时。

  • 将数据库还原到另一个服务器实例。

  • 在另一个服务器实例上附加数据库的副本。

某些应用程序依赖于单个用户数据库范围之外的信息、实体和/或对象。 通常,应用程序依赖于 mastermsdb 数据库,以及用户数据库。 用户数据库正确运行所需的存储在该数据库外部的任何内容必须在目标服务器实例上可用。 例如,应用程序的登录名作为元数据存储在 master 数据库中,必须在目标服务器上重新创建它们。 如果应用程序或数据库维护计划依赖于 SQL Server 代理作业(其元数据存储在 msdb 数据库中),则必须在目标服务器实例上重新创建这些作业。 同样,服务器级触发器的元数据存储在 master 中。

将应用程序的数据库移动到另一个服务器实例时,必须在目标服务器实例上重新创建 实体和 msdb 中依赖实体和对象的所有元数据。 例如,如果数据库应用程序使用服务器级触发器,则只需在新系统上附加或还原数据库是不够的。 除非在 master 数据库中手动为这些触发器重新创建元数据,否则数据库将无法按预期工作。

存储在用户数据库外部的信息、实体和对象

本主题的其余部分总结了可能影响另一个服务器实例上可用的数据库的潜在问题。 可能需要重新创建以下列表中列出的一个或多个信息、实体或对象类型。 若要查看摘要,请单击该项的链接。

服务器配置设置

SQL Server 2005 及更高版本选择性地安装和启动关键服务和功能。 这有助于减少系统的攻击面。 在新安装的默认配置中,许多功能均未启用。 如果数据库依赖于默认关闭的任何服务或功能,则必须在目标服务器实例上启用此服务或功能。

有关这些设置以及启用或禁用这些设置的详细信息,请参阅服务器配置选项(SQL Server)。

[Top]

资格证书

凭据是包含连接到 SQL Server 以外的资源时所需的身份验证信息的记录。 大多数凭据由 Windows 登录名和密码组成。

有关此功能的详细信息,请参阅凭据(数据库引擎)。

注释

SQL Server 代理帐户使用凭据。 若要了解代理帐户的凭据 ID,请使用 sysproxies 系统表。

[Top]

跨数据库查询

默认情况下,DB_CHAINING和 TRUSTWORTHY 数据库选项为 OFF。 如果原始数据库中的任一项设置为 ON,则可能需要在目标服务器实例的数据库中启用它们。 有关详细信息,请参阅 ALTER DATABASE (Transact-SQL)

附加和分离操作会禁用数据库的跨数据库所有者链。 有关如何启用链结的信息,请参阅 跨数据库所有权链结服务器配置选项

有关详细信息,另请参阅 设置镜像数据库以使用可信属性(Transact-SQL)

[Top]

数据库所有权

在另一台计算机上还原数据库时,启动还原作的 SQL Server 登录名或 Windows 用户将自动成为新数据库的所有者。 还原数据库后,系统管理员或新数据库所有者可以更改数据库所有权。

分布式查询和链接服务器

OLE DB 应用程序支持分布式查询和链接服务器。 分布式查询访问来自相同或不同计算机上的多个异类数据源的数据。 链接服务器配置使 SQL Server 能够针对远程服务器上的 OLE DB 数据源执行命令。 有关这些功能的详细信息,请参阅链接服务器(数据库引擎)。

[Top]

加密数据

如果在另一个服务器实例上提供的数据库包含加密的数据,并且数据库主密钥受原始服务器上的服务主密钥保护,则可能需要重新创建服务主密钥加密。 数据库主密钥是一个对称密钥,用于保护加密数据库中证书的私钥和非对称密钥。 创建后,使用 Triple DES 算法和用户提供的密码对数据库主密钥进行加密。

若要在服务器实例上启用数据库主密钥的自动解密,请使用服务主密钥加密此密钥的副本。 此加密副本存储在数据库和 master 中。 通常,每当主密钥发生更改时,存储在 主控形状 中的副本都以无提示方式更新。 SQL Server 首先尝试使用实例的服务主密钥解密数据库主密钥。 如果解密失败,SQL Server 会在凭据存储中搜索与需要主密钥的数据库具有相同系列 GUID 的主密钥凭据。 然后,SQL Server 会尝试使用每个匹配凭据解密数据库主密钥,直到解密成功或没有其他凭据。 必须使用 OPEN MASTER KEY 语句和密码打开未由服务主密钥加密的主密钥。

将加密的数据库复制、还原或附加到 SQL Server 的新实例时,服务主密钥加密的数据库主密钥副本不会存储在目标服务器实例的 master 中。 在目标服务器实例上,必须打开数据库的主密钥。 若要打开主密钥,请执行以下语句:OPEN MASTER KEY DECRYPTION BY PASSWORD ='password'。 然后,建议通过执行以下语句启用数据库主密钥的自动解密:ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY。 此 ALTER MASTER KEY 语句使用使用服务主密钥加密的数据库主密钥的副本预配服务器实例。 有关详细信息,请参阅 OPEN MASTER KEY(Transact-SQL)ALTER MASTER KEY(Transact-SQL)。

有关如何启用镜像数据库数据库主密钥的自动解密的信息,请参阅 设置加密的镜像数据库

有关详细信息,另请参阅:

[Top]

用户定义的错误消息

用户定义的错误消息驻留在 sys.messages 目录视图中。 此目录视图存储在 master 中。 如果数据库应用程序依赖于用户定义的错误消息,并且数据库在另一个服务器实例上可用,请使用 sp_addmessage 在目标服务器实例上添加这些用户定义的消息。

[Top]

事件提醒和 Windows Management Instrumentation(WMI)事件(服务器级别)

Server-Level 事件通知

服务器级事件通知存储在 msdb 中。 因此,如果数据库应用程序依赖于服务器级事件通知,则必须在目标服务器实例上重新创建该事件通知。 若要查看服务器实例上的事件通知,请使用 sys.server_event_notifications 目录视图。 有关详细信息,请参阅 事件通知

此外,使用 Service Broker 传递事件通知。 传入消息的路由不包括在包含服务的数据库中。 而是将显式路由存储在 msdb 中。 如果服务使用 msdb 数据库中的显式路由将传入消息路由到服务,则附加其他实例中的数据库时,必须重新创建此路由。

Windows Management Instrumentation (WMI) 事件

服务器事件的WMI提供程序允许你使用Windows管理规范(WMI)来监控SQL Server中的事件。 依赖于通过数据库依赖的 WMI 提供程序公开的服务器级事件的任何应用程序都必须定义目标服务器实例的计算机。 WMI 事件提供程序使用 msdb 中定义的目标服务创建事件通知。

注释

有关详细信息,请参阅 适用于服务器事件概念的 WMI 提供程序

使用 SQL Server Management Studio 创建 WMI 警报

镜像数据库的事件通知的工作原理

根据定义,涉及镜像数据库的事件通知的跨数据库传递是远程的,因为镜像数据库可以故障转移。 Service Broker 以 镜像路由的形式为镜像数据库提供特殊支持。 镜像路由有两个地址:一个用于主体服务器实例,一个用于镜像服务器实例。

通过设置镜像路由,可以让 Service Broker 路由了解数据库镜像。 镜像路由使 Service Broker 能够以透明方式将会话重定向到当前主体服务器实例。 例如,请考虑一个服务 Service_A,它由镜像数据库 Database_A 托管。 假设你需要另一个服务(Service_B)由 Database_B 承载,以便与Service_A对话。 若要实现此对话框,Database_B必须包含Service_A的镜像路由。 此外,Database_A必须包含到Service_B的非镜像 TCP 路由,与本地路由不同的是,该路由在故障转移后仍然有效。 这些路由使 ACK 能够在故障转移后恢复。 由于发送方的服务始终以相同的方式命名,因此路由必须指定代理实例。

无论镜像数据库中的服务是发起程序服务还是目标服务,镜像路由的要求都适用:

  • 如果目标服务位于镜像数据库中,发起程序服务必须具有镜像路由回目标。 但是,目标可以有一个固定的路径返回到发起者。

  • 如果发起程序服务位于镜像数据库中,则目标服务必须具有镜像路由回发起程序才能传递确认和答复。 不过,发起者通常可以有一条到目标的常规路径。

[Top]

扩展存储过程

重要

此功能将在Microsoft SQL Server 的未来版本中删除。 避免在新开发工作中使用此功能,并计划修改当前使用此功能的应用程序。 请改用 CLR 集成

扩展存储过程是使用 SQL Server 扩展存储过程 API 编程的。 sysadmin 固定服务器角色的成员可以将扩展存储过程注册到 SQL Server 实例,并向用户授予执行该过程的权限。 扩展存储过程只能添加到 master 数据库。

扩展存储过程直接在 SQL Server 实例的地址空间中运行,它们可能会生成内存泄漏或其他问题,从而降低服务器的性能和可靠性。 应考虑将扩展存储过程存储在与包含引用数据的实例分开的 SQL Server 实例中。 还应考虑使用分布式查询来访问数据库。

重要

在将扩展存储过程添加到服务器并向其他用户授予 EXECUTE 权限之前,系统管理员应彻底检查每个扩展存储过程,以确保它不包含有害或恶意代码。

有关详细信息,请参阅 GRANT 对象权限(Transact-SQL)DENY 对象权限(Transact-SQL)REVOKE 对象权限(Transact-SQL)。

[Top]

用于 SQL Server 属性的 Full-Text 引擎

在 Full-Text 引擎上使用 sp_fulltext_service 设置属性。 确保目标服务器实例具有这些属性所需的设置。 有关这些属性的详细信息,请参阅 FULLTEXTSERVICEPROPERTY (Transact-SQL)

此外,如果 断字符和词干分析器 组件或 全文搜索筛选器 组件在原始服务器实例和目标服务器实例上具有不同的版本,则全文索引和查询的行为可能有所不同。 此外, 同义词库 存储在特定于实例的文件中。 必须将这些文件的副本传输到目标服务器实例上的等效位置,或在新实例上重新创建这些文件。

注释

将包含全文目录文件的 SQL Server 2005 数据库附加到 SQL Server 2014 服务器实例上时,目录文件与 SQL Server 2005 中的其他数据库文件一起附加到以前的位置。 有关详细信息,请参阅 全文搜索升级

有关详细信息,另请参阅:

[Top]

职位

如果数据库依赖于 SQL Server 代理作业,则必须在目标服务器实例上重新创建它们。 作业取决于其环境。 如果计划在目标服务器实例上重新创建现有作业,则可能需要修改目标服务器实例以匹配原始服务器实例上该作业的环境。 以下环境因素非常重要:

  • 作业使用的登录名

    若要创建或执行 SQL Server 代理作业,必须先将作业所需的任何 SQL Server 登录名添加到目标服务器实例。 有关详细信息,请参阅 “配置用户以创建和管理 SQL Server 代理作业”。

  • SQL Server 代理服务启动帐户

    服务启动帐户可以定义运行 SQL Server 代理的 Microsoft Windows 帐户及其网络权限。 SQL Server 代理在指定的用户帐户下运行。 代理服务的上下文会影响作业及其运行环境的配置。 该帐户必须有权访问作业所需的资源,例如网络共享。 有关如何选择和修改服务启动帐户的信息,请参阅 为 SQL Server 代理服务选择帐户

    若要正常运行,必须将服务启动帐户配置为具有正确的域、文件系统和注册表权限。 此外,作业可能需要配置共享网络资源,并且该资源必须为服务帐户配置。 有关信息,请参阅 配置 Windows 服务帐户和权限

  • 与特定 SQL Server 实例关联的 SQL Server 代理服务具有自己的注册表配置单元,其作业通常依赖于此注册表配置单元中的一个或多个设置。 若要按预期方式运行,作业需要这些注册表设置。 如果使用脚本在另一个 SQL Server 代理服务中重新创建作业,其注册表可能没有该作业的正确设置。 要使重新创建的作业在目标服务器实例上正常运行,原始和目标 SQL Server 代理服务应具有相同的注册表设置。

    谨慎

    如果其他作业需要当前设置,则更改目标 SQL Server 代理服务中用于处理重新创建的作业的注册表设置可能会有问题。 此外,错误地编辑注册表可能会严重损坏系统。 在更改注册表之前,建议在计算机上备份任何值数据。

  • SQL Server 代理

    SQL Server 代理为指定的作业步骤定义安全上下文。 若要使作业在目标服务器实例上运行,必须在该实例上手动重新创建它所需的所有代理。 有关详细信息,请参阅 创建 SQL Server 代理代理 并对 使用代理的多服务器作业进行故障排除

有关详细信息,另请参阅:

查看现有作业及其属性

创建职位

使用脚本重新创建作业的最佳做法

建议首先编写简单的作业脚本,在其他 SQL Server 代理服务上重新创建作业,并运行该作业以查看它是否按预期工作。 这样,你便能够识别不兼容问题,并尝试解决它们。 如果脚本化作业在其新环境中无法按预期工作,建议创建一个在该环境中正常工作的等效作业。

[Top]

登录

登录到 SQL Server 实例需要有效的 SQL Server 登录名。 此登录名用于验证主体是否可以连接到 SQL Server 实例的身份验证过程。 未定义或服务器实例上未正确定义相应 SQL Server 登录名的数据库用户无法登录到该实例。 这样的用户被称为此服务器实例上的数据库的“孤立用户” 。 在数据库被还原、附加或复制到其他 SQL Server 实例后,数据库用户可能会进入孤立状态。

若要为数据库原始副本中的某些或所有对象生成脚本,可以使用“生成脚本向导”,然后在“ 选择脚本选项 ”对话框中,将 “脚本登录 ”选项设置为 True

[Top]

权限

当数据库在另一个服务器实例上可用时,以下类型的权限可能会受到影响。

  • 对系统对象的 GRANT、REVOKE 或 DENY 权限

  • 对服务器实例的 GRANT、REVOKE 或 DENY 权限(服务器级权限

对系统对象授予、撤销和拒绝权限

对系统对象(如存储过程、扩展存储过程、函数和视图)的权限存储在 master 数据库中,必须在目标服务器实例上配置。

若要为数据库原始副本中的部分或所有对象生成脚本,可以使用“生成脚本向导”,然后在“ 选择脚本选项 ”对话框中,将“ 脚本 Object-Level 权限 ”选项设置为 True

重要

如果你编写登录脚本,密码不会被包含在脚本中。 如果有使用 SQL Server 身份验证的登录名,则必须修改目标上的脚本。

系统对象在 sys.system_objects 目录视图中可见。 对系统对象的权限在 master 数据库中的sys.database_permissions目录视图中可见。 有关查询这些目录视图和授予系统对象权限的信息,请参阅 GRANT 系统对象权限(Transact-SQL)。 有关详细信息,请参阅 REVOKE 系统对象权限(Transact-SQL)DENY 系统对象权限(Transact-SQL)。

对服务器实例的 GRANT、REVOKE 和 DENY 权限

服务器范围的权限存储在 master 数据库中,必须在目标服务器实例上配置。 有关服务器实例的服务器权限的信息,请查询 sys.server_permissions 目录视图、有关服务器主体的信息查询 sys.server_principals目录视图,以及有关服务器角色成员身份的信息查询 sys.server_role_members 目录视图。

有关详细信息,请参阅 GRANT 服务器权限(Transact-SQL)REVOKE 服务器权限(Transact-SQL)DENY 服务器权限(Transact-SQL)。

Server-Level 证书或非对称密钥的权限

服务器级权限不能直接授予证书或非对称密钥。 相反,服务器级权限将授予为特定证书或非对称密钥专用创建的映射登录名。 因此,每个需要服务器级权限的证书或非对称密钥都需要自己的 证书映射登录 名或 非对称密钥映射登录名。 若要为证书或非对称密钥授予服务器级权限,请向其映射的登录名授予权限。

注释

映射登录名仅用于使用相应证书或非对称密钥签名的代码的授权。 映射的登录名不能用于身份验证。

映射的登录名及其权限都驻留在 master 中。 如果证书或非对称密钥驻留在 master 以外的数据库中,则必须在 master 中重新创建它,并将其映射到登录名。 如果将数据库移动、复制或还原到另一个服务器实例,则必须在目标服务器实例 的主 数据库中重新创建其证书或非对称密钥,映射到登录名,并向该登录名授予所需的服务器级权限。

创建证书或非对称密钥

将证书或非对称密钥映射到登录账号

向映射登录名分配权限

有关证书和非对称密钥的详细信息,请参阅 加密层次结构

[Top]

复制设置

如果将复制数据库的备份还原到另一个服务器或数据库,则无法保留复制设置。 在这种情况下,必须在还原备份后重新创建所有发布和订阅。 若要简化此过程,请为当前复制设置创建脚本,以及为启用和禁用复制创建脚本。 为了帮助重新创建复制设置,请复制这些脚本并更改服务器名称引用以用于目标服务器实例。

有关详细信息,请参阅备份和还原复制的数据库数据库镜像和复制(SQL Server)以及日志传送和复制(SQL Server)。

[Top]

Service Broker 应用程序

Service Broker 应用程序的许多方面都随数据库一起移动。 但是,必须在新位置重新创建或重新配置应用程序的某些方面。

[Top]

启动过程

启动过程是一个存储过程,该存储过程标记为自动执行,并在每次 SQL Server 启动时执行。 如果数据库依赖于任何启动过程,则必须在目标服务器实例上定义它们,并将其配置为在启动时自动执行。

[Top]

服务器级别的触发器

DDL 触发器触发存储过程,以响应各种数据定义语言 (DDL) 事件。 这些事件主要对应于以关键字 CREATE、ALTER 和 DROP 开头的 Transact-SQL 语句。 某些系统存储过程在执行类似于 DDL 的操作时,也可以触发 DDL 触发器。

有关此功能的详细信息,请参阅 DDL 触发器

[Top]

另请参阅

包含的数据库
将数据库复制到其他服务器
数据库分离和附加 (SQL Server)
故障转移到日志传送辅助服务器 (SQL Server)
数据库镜像会话期间的角色切换 (SQL Server)
设置加密的镜像数据库
SQL Server 配置管理器
孤立用户故障排除 (SQL Server)