使数据库在其他服务器上可用时管理元数据

适用于: SQL Server

本文与下列情况有关:

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

  • 设置数据库镜像。

  • 准备在日志传送配置中交换主服务器和辅助服务器的角色。

  • 将数据库还原到其他服务器实例。

  • 在其他服务器实例上附加数据库副本。

  • 使用该方法执行数据库引擎升级 - 迁移到新的安装。

  • 将数据库迁移到 Azure SQL(虚拟机或托管实例)。

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

将应用程序的数据库移动到其他服务器实例时,必须在目标服务器实例的 mastermsdb 中重新创建依赖实体和依赖对象的所有元数据。 例如,如果数据库应用程序使用服务器级触发器,则仅在新系统上附加或还原数据库是不够的。 如果不手动在 master 数据库中重新创建这些触发器的元数据,数据库就不能按预期方式工作。

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

本文的其余部分概要说明了可能影响在其他服务器实例上可用的数据库的潜在问题。 最好重新创建以下列表中列出的一种或多种信息、实体或对象。 若要查看概要内容,请选择该项的链接。

服务器配置设置

SQL Server 2005 (9.x) 及更高版本会选择性地安装和启动密钥服务和功能。 这有助于减少系统可遭受攻击的外围应用。 在新安装的默认配置中,许多功能并未启用。 如果数据库依赖于默认处于禁用状态的服务或功能,则必须在目标服务器实例上启用此服务或功能。

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

凭据

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

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

注意

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

跨数据库查询

DB_CHAINING 和 TRUSTWORTHY 数据库选项默认设置为 OFF。 如果针对原始数据库将这两个选项之一设置为 ON,则可能必须对目标服务器实例上的数据库启用这两个选项。 有关详细信息,请参阅 ALTER DATABASE (Transact-SQL)

附加和分离操作都会禁用数据库的跨数据库所有权链接。 有关如何启用链接的详细信息,请参阅 cross db ownership chaining 服务器配置选项

有关详细信息,请参阅《将镜像数据库设置为使用 Trustworthy 属性 (Transact-SQL)》

数据库所有权

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

分布式查询和链接服务器

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

加密数据

如果在其他服务器实例上可用的数据库包含加密数据,并且数据库主密钥由原始服务器上的服务主密钥保护,则最好重新进行服务主密钥加密。 “数据库主密钥 ”是一种对称密钥,用于在加密数据库中保护证书的私钥和非对称密钥的私钥。 当创建数据库主密钥时,会使用 Triple DES 算法以及用户提供的密码对其进行加密。

若要对服务器实例上的数据库主密钥启用自动解密,请使用服务主密钥对此密钥的副本进行加密。 此加密副本存储在此数据库以及 master 中。 通常,每当主密钥更改时,都会在不进行提示的情况下更新存储在 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)》

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

有关详细信息,请参阅:

用户定义的错误消息

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

事件通知和 Windows Management Instrumentation (WMI) 事件(服务器级)

服务器级事件通知

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

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

Windows Management Instrumentation (WMI) 事件

使用服务器事件的 WMI 提供程序,可以使用 Windows Management Instrumentation (WMI) 监视 SQL Server 中的事件。 必须在目标服务器实例所在的计算机上定义任何依赖于服务器级事件(此事件通过数据库所依赖的 WMI 提供程序显示)的应用程序。 WMI 事件提供程序使用在 msdb 中定义的目标服务创建事件通知。

注意

有关详细信息,请参阅 WMI Provider for Server Events 的概念

使用 SQL Server Management Studio 创建 WMI 警报

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

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

通过设置镜像路由,你可以使 Service Broker 路由支持数据库镜像。 使用镜像路由,Service Broker 能够透明地将会话重定向到当前的主体服务器实例。 例如,有一项由镜像数据库 Database_A 承载的服务 Service_A。 假定您需要由 Database_B 承载的另一项服务 Service_B 与 Service_A 进行对话。 为了实现此对话,Database_B 必须包含 Service_A 的镜像路由。 此外,Database_A 必须包含 Service_B 的非镜像 TCP 传输路由,与本地路由不同的是,该路由在故障转移后保持有效。 这些路由使 ACK 能够在故障转移后恢复。 由于发送方的服务始终以相同方式命名,因此路由必须指定 Broker 实例。

不管镜像数据库中的服务是发起方服务还是目标服务,下列情况均要求使用镜像路由:

  • 如果目标服务位于镜像数据库中,则发起方服务必须具有返回目标的镜像路由。 但是,目标可以具有返回发起方的常规路由。

  • 如果发起方服务位于镜像数据库中,则目标服务必须具有返回发起方的镜像路由,以传递确认和应答。 但是,发起方可能拥有指向目标的常规路由。

扩展存储过程

重要

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

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

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

重要

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

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

SQL Server 属性的全文引擎

全文引擎的属性是通过 sp_fulltext_service设置的。 请确保目标服务器实例具有这些属性的必需设置。 有关这些属性的详细信息,请参阅《FULLTEXTSERVICEPROPERTY (Transact SQL)》

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

注意

将包含全文目录文件的 SQL Server 2005 (9.x) 数据库附加到 SQL Server 服务器实例时,与 SQL Server 2005 (9.x) 中一样,目录文件与其他数据库文件一起从旧位置附加。 有关详细信息,请参阅 全文搜索升级

有关详细信息,请参阅:

作业

如果数据库依赖于 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 代理服务上重新创建此作业,然后运行此作业以查看它是否按预期方式工作。 这样便可确定不兼容性并尝试进行解决。 如果已编写脚本的作业在新环境中未按预期方式工作,则建议你创建可在此环境中正常工作的等价作业。

登录

登录到 SQL Server 实例需要有效的 SQL Server 登录名。 在身份验证过程中会使用此登录名,以验证主体是否可以连接到 SQL Server 实例。 在服务器实例上未定义或错误定义了其相应 SQL Server 登录名的数据库用户无法登录到实例。 这样的用户被称为此服务器实例上的数据库的“孤立用户” 。 当数据库还原、附加或复制到 SQL Server 的其他实例之后,数据库用户便可变为孤立用户。

若要为数据库原始副本中的部分或全部对象生成脚本,可以使用生成脚本向导,并在 “选择脚本选项” 对话框中将 “编写登录脚本” 选项设置为 True

权限

当数据库在其他服务器实例上可用时,下列类型的权限可能受到影响。

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

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

对系统对象的 GRANT、REVOKE 和 DENY 权限

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

若要为数据库原始副本中的部分或全部对象生成脚本,可以使用生成脚本向导,并在“选择脚本选项”对话框中将“编写对象级权限脚本”选项设置为 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)》

证书或非对称密钥的服务器级权限

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

注意

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

映射登录名及其权限都位于 master 中。 如果证书或非对称密钥位于 master 之外的数据库中,则必须在 master 中重新创建证书或非对称密钥并将其映射到登录名。 如果将数据库移动、复制或还原到其他服务器实例,则必须在目标服务器实例的 master 数据库中重新创建其证书或非对称密钥,将证书或非对称密钥映射到登录名,并向此登录名授予必需的服务器级权限。

创建证书或非对称密钥

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

为映射登录名分配权限

有关证书和非对称密钥的详细信息,请参阅 Encryption Hierarchy

Trustworthy 属性

TRUSTWORTHY 数据库属性用于指明此 SQL Server 实例是否信任该数据库以及其中的内容。 为安全起见,默认情况下,附加数据库后此选项需设置为 OFF,即使源服务器上此选项被设置为 ON。 有关此属性的详细信息,请参阅《TRUSTWORTHY 数据库属性》,有关如何启用此选项的信息,请参阅《ALTER DATABASE (Transact-SQL)》

复制设置

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

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

Service Broker 应用程序

Service Broker 应用程序的许多相关内容都将随数据库一起移动。 但是,应用程序的某些相关内容必须在新位置重新创建或重新配置。 为安全起见,默认情况下,从其他服务器附加数据库后,is_broker_enabled 和 is_honoor_broker_priority_on 的选项设置为 OFF。 有关如何将这些选项设置为 ON 的详细信息,请参阅《ALTER DATABASE (Transact-SQL)》

启动过程

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

触发器(服务器级)

DDL 触发器激发存储过程以响应多个数据定义语言 (DDL) 事件。 这些事件主要与以关键字 CREATE、ALTER 和 DROP 开头的 Transact-SQL 语句对应。 执行 DDL 式操作的系统存储过程也可以激发 DDL 触发器。

有关此功能的详细信息,请参阅 DDL Triggers

另请参阅

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