当数据库在其他服务器实例上可用时管理元数据 (SQL Server)
本主题与下列情况有关:
配置Always On可用性组可用性组的可用性副本。
设置数据库镜像。
准备在日志传送配置中交换主服务器和辅助服务器的角色。
将数据库还原到其他服务器实例。
在其他服务器实例上附加数据库副本。
某些应用程序依赖于单个用户数据库范围之外的信息、实体和/或对象。 通常,应用程序具有对 master 和 msdb 数据库的依赖关系,并且还具有对用户数据库的依赖关系。 用户数据库正确运行所需的存储在该数据库外部的任何内容必须在目标服务器实例上可用。 例如,应用程序的登录名作为元数据存储在 master 数据库中,必须在目标服务器上重新创建这些登录名。 如果应用程序或数据库维护计划依赖于SQL Server 代理作业(其元数据存储在 msdb 数据库中),则必须在目标服务器实例上重新创建这些作业。 同样,服务器级触发器的元数据存储在 master中。
将应用程序的数据库移动到其他服务器实例时,必须在目标服务器实例的 master 和 msdb 中重新创建依赖实体和依赖对象的所有元数据 。 例如,如果数据库应用程序使用服务器级触发器,则仅在新系统上附加或还原数据库是不够的。 如果不手动在 master 数据库中重新创建这些触发器的元数据,则数据库不能按预期方式工作。
存储在用户数据库外部的信息、实体和对象
此主题的其余部分概要说明了可能影响在其他服务器实例上可用的数据库的潜在问题。 最好重新创建以下列表中列出的一种或多种信息、实体或对象。 若要查看概要内容,请单击该项的链接。
服务器配置设置
SQL Server 2005 及更高版本有选择地安装和启动关键服务和功能。 这有助于减少系统可遭受攻击的外围应用。 在新安装的默认配置中,许多功能并未启用。 如果数据库依赖于默认处于禁用状态的服务或功能,则必须在目标服务器实例上启用此服务或功能。
有关这些设置以及启用或禁用这些设置的详细信息,请参阅服务器配置选项 (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 实例。
不管镜像数据库中的服务是发起方服务还是目标服务,下列情况均要求使用镜像路由:
如果目标服务位于镜像数据库中,则发起方服务必须具有返回目标的镜像路由。 但是,目标可以具有返回发起方的常规路由。
如果发起方服务位于镜像数据库中,则目标服务必须具有返回发起方的镜像路由,以传递确认和应答。 但是,发起方可能拥有指向目标的常规路由。
扩展存储过程
重要
后续版本的 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) 。
SQL Server 属性的全文引擎
全文引擎的属性是通过 sp_fulltext_service设置的。 请确保目标服务器实例具有这些属性的必需设置。 有关这些属性的详细信息,请参阅 FULLTEXTSERVICEPROPERTY (Transact-SQL) 。
此外,如果原始服务器实例和目标服务器示例具有不同版本的 断字符和词干分析器 组件或 全文搜索筛选器 组件,则全文索引和查询的行为可能有所不同。 此外, 同义词库 存储在特定于实例的文件中。 您必须将这些文件的副本传输到目标服务器实例上的相同位置,或者在新的实例上重新创建这些文件。
注意
将包含全文目录文件的 SQL Server 2005 数据库附加到 SQL Server 2014 服务器实例时,目录文件将从其以前的位置与其他数据库文件一起附加,与 SQL Server 2005 中相同。 有关详细信息,请参阅 全文搜索升级。
有关详细信息,请参阅:
作业
如果数据库依赖于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) 实例时配置 Windows 服务帐户和权限 (
在安装 SQL Server) 实例时配置SQL Server 代理 (
查看现有作业及其属性
创建作业
使用脚本重新创建作业的最佳实践
建议首先编写一个简单的作业脚本,在其他SQL Server 代理服务上重新创建作业,并运行该作业以查看它是否按预期工作。 这样便可确定不兼容性并尝试进行解决。 如果已编写脚本的作业在新环境中未按预期方式工作,则建议您创建可在此环境中正常工作的等价作业。
登录名
登录到 SQL Server 实例需要有效的SQL Server登录名。 此登录名用于验证主体是否可以连接到 SQL Server 实例的身份验证过程。 服务器实例上的相应SQL Server登录名未定义或未正确定义的数据库用户无法登录到实例。 这样的用户被称为此服务器实例上的数据库的“孤立用户” 。 如果在还原、附加数据库或将数据库复制到SQL Server的不同实例之后,数据库用户可能会成为孤立数据库用户。
若要为数据库原始副本中的部分或全部对象生成脚本,可以使用生成脚本向导,并在 “选择脚本选项” 对话框中将 “编写登录脚本” 选项设置为 True。
注意
有关如何为镜像数据库设置登录名的信息,请参阅为数据库镜像或 AlwaysOn 可用性组设置登录帐户 (SQL Server) 以及角色切换后登录名和作业的管理 (SQL Server) 。
权限
当数据库在其他服务器实例上可用时,下列类型的权限可能受到影响。
对系统对象的 GRANT、REVOKE 或 DENY 权限
对服务器实例的 GRANT、REVOKE 或 DENY 权限(服务器级权限)
对系统对象的 GRANT、REVOKE 和 DENY 权限
对系统对象(例如存储过程、扩展存储过程、函数和视图)的权限存储在 master 数据库中,并且必须在目标服务器实例上进行配置。
若要为数据库原始副本中的部分或全部对象生成脚本,可以使用生成脚本向导,并在“选择脚本选项”对话框中将“编写对象级权限脚本”选项设置为 True。
重要
如果编写登录脚本,则不编写密码的脚本。 如果登录名使用SQL Server身份验证,则必须修改目标上的脚本。
在 sys.system_objects 目录视图中可以查看系统对象。 在 master 数据库中的 sys.database_permissions 目录视图中可以查看对系统对象的权限。 有关查询这些目录视图和授予系统对象权限的信息,请参阅 GRANT System Object Permissions (Transact-SQL) 。 有关详细信息,请参阅 REVOKE 系统对象权限 (Transact-SQL) 和 DENY 系统对象权限 (Transact-SQL) 。
对服务器实例的 GRANT、REVOKE 和 DENY 权限
服务器范围的权限存储在 master 数据库中,并且必须在目标服务器实例上进行配置。 有关服务器实例的服务器权限的信息,请查询 sys.server_permissions 目录视图;有关服务器主体的信息,请查询 sys.server_principals目录视图;有关服务器角色成员身份的信息,请查询 sys.server_role_members 目录视图。
有关详细信息,请参阅 GRANT Server Permissions (Transact-SQL) 、 REVOKE Server Permissions (Transact-SQL) 和 DENY Server Permissions (Transact-SQL) 。
证书或非对称密钥的服务器级权限
不能向证书或非对称密钥直接授予服务器级权限。 相反,可以向专门针对特定证书或非对称密钥创建的映射登录名授予服务器级权限。 因此,每个需要服务器级权限的证书或非对称密钥都需要自己的“证书映射登录名 ”或“非对称密钥映射登录名 ”。 若要为证书或非对称密钥授予服务器级权限,请向其映射登录名授予相应权限。
注意
映射登录名仅用于对使用相应证书或非对称密钥签名的代码进行授权。 映射登录名不能用于身份验证。
映射登录名及其权限都位于 master中。 如果证书或非对称密钥位于 master之外的数据库中,则必须在 master 中重新创建证书或非对称密钥并将其映射到登录名。 如果将数据库移动、复制或还原到其他服务器实例,则必须在目标服务器实例的 master 数据库中重新创建其证书或非对称密钥,将证书或非对称密钥映射到登录名,并向此登录名授予必需的服务器级权限。
创建证书或非对称密钥
将证书或非对称密钥映射到登录名
为映射登录名分配权限
有关证书和非对称密钥的详细信息,请参阅 Encryption Hierarchy。
复制设置
如果将复制数据库的备份还原到其他服务器或数据库,则无法保留复制设置。 在这种情况下,您必须在还原备份后重新创建所有发布和订阅。 为使此过程更加简单,请创建用于当前复制设置以及启用和禁用复制的脚本。 为了帮助重新创建复制设置,请复制这些脚本,并更改服务器名称引用以用于目标服务器实例。
有关详细信息,请参阅备份和还原复制的数据库、数据库镜像和复制 (SQL Server) 和日志传送和复制 (SQL Server) 。
Service Broker 应用程序
Service Broker 应用程序的许多方面随数据库一起移动。 但是,应用程序的某些相关内容必须在新位置重新创建或重新配置。
启动过程
启动过程是标记为自动执行的存储过程,每次SQL Server启动时都会执行。 如果数据库依赖于启动过程,则必须在目标服务器实例上定义这些启动过程并将其配置为启动时自动执行。
触发器(服务器级)
DDL 触发器激发存储过程以响应各种数据定义语言 (DDL) 事件。 这些事件主要对应于以关键字 CREATE、ALTER 和 DROP 开头的 Transact-SQL 语句。 执行 DDL 式操作的系统存储过程也可以激发 DDL 触发器。
有关此功能的详细信息,请参阅 DDL Triggers。
另请参阅
包含的数据库
将数据库复制到其他服务器
数据库分离和附加 (SQL Server)
故障转移到日志传送辅助服务器 (SQL Server)
数据库镜像会话期间的角色切换 (SQL Server)
设置加密的镜像数据库
SQL Server 配置管理器
孤立用户故障排除 (SQL Server)