数据库镜像可与复制结合使用,以提高发布数据库的可用性。 数据库镜像涉及一个通常驻留在不同计算机上的单个数据库的两个副本。 在任何给定时间都只有一个数据库副本可供客户端使用。 此副本称为主体数据库。 客户端对主体数据库的更新将应用于数据库的另一个副本,称为镜像数据库。 镜像涉及将主体数据库上每次插入、更新或删除操作的事务日志应用到镜像数据库中。
发布数据库完全支持到镜像的复制故障转移,而订阅数据库则仅提供有限支持。 分发数据库不支持数据库镜像。 有关恢复分发数据库或订阅数据库而无需重新配置复制的信息,请参阅 备份和还原复制的数据库。 有关镜像订阅服务器数据库的信息,请参阅
注释
故障转移后,镜像将成为主体。 在本主题中,“principal”和“mirror”始终引用原始主体和镜像。
使用复制和数据库镜像结合时的要求和注意事项
在将复制与数据库镜像配合使用时,请注意以下要求和注意事项:
主体和镜像必须共享分发服务器。 我们建议使用远程分发器,以便在发布服务器发生计划外故障转移时提供更高的容错能力。
复制支持镜像发布数据库进行合并复制,以及使用只读订阅服务器或排队更新订阅服务器进行事务复制。 不支持立即更新订阅服务器、Oracle 发布服务器、对等拓扑中的发布服务器和重新发布。
数据库外部存在的元数据和对象不会复制到镜像,包括登录名、作业、链接服务器等。 如果需要镜像中的元数据和对象,则必须手动复制它们。 有关详细信息,请参阅 角色切换后登录名和作业的管理(SQL Server)。
使用数据库镜像配置复制
配置复制和数据库镜像涉及五个步骤。 下一部分将更详细地介绍每个步骤。
配置发布者。
配置数据库镜像。
将镜像配置为使用与主体相同的分发服务器。
为故障转移配置复制代理。
将主体和镜像添加到复制监视器中。
步骤 1 和步骤 2 也可以按相反的顺序执行。
为发布库配置数据库镜像
配置发布者:
建议使用远程分发服务器。 有关配置分发的详细信息,请参阅 “配置分发”。
可以为快照发布、事务发布或合并发布启用数据库。 对于将包含多个发布类型的镜像数据库,必须在同一节点上使用 sp_replicationdboption 启用数据库以支持这些类型。 例如,您可以在主服务器上执行以下存储过程调用:
exec sp_replicationdboption @dbname='<PublicationDatabase>', @optname='publish', @value=true; exec sp_replicationdboption @dbname='<PublicationDatabase>', @optname='mergepublish', @value=true;
有关创建发布的详细信息,请参阅 发布数据和数据库对象。
配置数据库镜像。 有关详细信息,请参阅 使用 Windows 身份验证建立数据库镜像会话(SQL Server Management Studio) 和 设置数据库镜像(SQL Server)。
为镜像配置分发设置。 将镜像名称指定为发布服务器,并指定主体使用的同一分发服务器和快照文件夹。 例如,如果要使用存储过程配置复制,请在分发服务器上执行 sp_adddistpublisher ;然后在镜像处执行 sp_adddistributor 。 对于 sp_adddistpublisher:
将 @publisher 参数的值设置为镜像的网络名称。
将 @working_directory 参数的值设置为主体使用的快照文件夹。
指定 -PublisherFailoverPartner 代理参数的镜像名称。 以下所述代理在故障转移后识别镜像需要此参数:
快照代理(适用于所有发布项)
日志读取代理(适用于所有事务发布)
队列读取器代理(对于支持排队更新订阅的事务发布)
合并代理程序(适用于合并订阅)
SQL Server 复制监听器(replisapi.dll:用于使用 Web 同步进行同步的合并订阅)
SQL Merge ActiveX 控件(用于与控件同步的合并订阅)
分发代理和分发 ActiveX 控件没有此参数,因为它们未连接到发布服务器。
代理参数更改在下次启动代理时生效。 如果代理连续运行,则必须停止并重启代理。 可以在代理配置文件和命令提示符中指定参数。 有关详细信息,请参见:
建议将 -PublisherFailoverPartner 添加到代理配置文件,然后在配置文件中指定镜像名称。 例如,如果要使用存储过程配置复制:
-- Execute sp_help_agent_profile in the context of the distribution database to get the list of profiles. -- Select the profile id of the profile that needs to be updated from the result set. -- In the agent_type column returned by sp_help_agent_profile: -- 1 = Snapshot Agent; 2 = Log Reader Agent; 3 = Distribution Agent; 4 = Merge Agent; 9 = Queue Reader Agent. exec sp_help_agent_profile; -- Setting the -PublisherFailoverPartner parameter in the default Snapshot Agent profile (profile 1). -- Execute sp_add_agent_parameter in the context of the distribution database. exec sp_add_agent_parameter @profile_id = 1, @parameter_name = N'-PublisherFailoverPartner', @parameter_value = N'<Failover Partner Name>'; -- Setting the -PublisherFailoverPartner parameter in the default Merge Agent profile (profile 6). -- Execute sp_add_agent_parameter in the context of the distribution database. exec sp_add_agent_parameter @profile_id = 6, @parameter_name = N'-PublisherFailoverPartner', @parameter_value = N'<Failover Partner Name>';
将主体数据库和镜像数据库添加到复制监控器。 有关详细信息,请参阅 从复制监视器中添加和删除发布服务器。
维护镜像出版物数据库
维护镜像发布数据库实质上与维护非镜像数据库相同,需要注意以下事项:
必须在活动服务器上进行管理和监视。 在 SQL Server Management Studio 中,发布仅显示在活动服务器的 “本地发布” 文件夹下。 例如,如果故障转移到镜像,则发布会在镜像上查看,并且不再在主服务器上查看。 如果数据库故障转移到镜像,可能需要手动刷新 Management Studio 和复制监视器以反映更改。
复制监视器在主服务器和镜像的对象树中显示发布者节点。 如果主体是活动服务器,则发布信息仅显示在复制监视器中的主体节点下。
如果镜像是活动服务器:
如果代理出错,则错误仅在主节点上显示,而不在镜像节点上显示。
如果主体不可用,则主体和镜像节点将显示相同的发布列表。 应对镜像节点下的发布进行监控。
使用存储过程或复制管理对象(RMO)在镜像环境中管理复制时,如果指定发布者名称,则必须指定启用数据库进行复制的实例名称。 若要确定适当的名称,请使用函数 publishingservername。
镜像发布数据库时,存储在镜像数据库中的复制元数据与主体数据库中存储的元数据相同。 因此,对于在主服务器上启用复制的发布数据库,存储在镜像服务器的系统表中的发布服务器实例名称是主服务器的名称,而不是镜像服务器。 如果发布数据库故障转移到镜像,这会影响复制配置和维护。 例如,如果在故障转移后使用镜像上的存储过程配置复制,并且想要将请求订阅添加到在主体上启用的发布数据库,则必须为sp_addpullsubscription或sp_addmergepullsubscription的@publisher参数指定主体名称,而不是镜像名称。
如果在故障转移到镜像后启用镜像上的发布数据库,那么存储在系统表中的发布服务器实例名称将会是镜像的名称。在本例中,应为 @publisher 参数使用镜像的名称。
注释
在某些情况下(例如 sp_addpublication), @publisher参数仅 支持非 SQL Server 发布服务器;在这些情况下,它与 SQL Server 数据库镜像无关。
若要在故障转移后同步 Management Studio 中的订阅:从订阅服务器同步请求订阅;并从活动发布服务器同步推送订阅。
镜像被移除后的复制行为
如果从已发布的数据库中删除数据库镜像,请记住以下问题:
如果主服务器上的发布数据库不再镜像,复制将继续在原始主服务器上正常工作。
如果发布数据库从主体切换到镜像,并且镜像关系随后被禁用或移除,则复制代理将无法在镜像上运行。 如果主体永久丢失,请禁用,然后使用指定为发布服务器的镜像重新配置复制。
如果完全删除数据库镜像,则镜像数据库处于恢复状态,必须还原才能正常运行。 恢复的数据库相对于复制的行为取决于是否指定了KEEP_REPLICATION选项。 此选项在将已发布的数据库还原到除创建备份的服务器之外的服务器时,强制保留复制设置。 仅当其他发布数据库不可用时,才使用 KEEP_REPLICATION 选项。 如果其他发布数据库仍然完好无损且正在复制,则不支持此选项。 有关KEEP_REPLICATION的详细信息,请参阅 RESTORE (Transact-SQL)。
日志读取器代理行为
下表介绍了数据库镜像的各种作模式的日志读取器代理行为。
操作模式 | 如果镜像不可用时,日志读取器代理的行为 |
---|---|
高安全模式附带自动故障转移功能 | 如果镜像不可用,日志读取器代理会将命令传播到分发数据库。 主服务器在镜像服务器未恢复联机并获取主服务器的所有事务前,无法切换到镜像服务器。 |
高性能模式 | 如果镜像不可用,则主体数据库将处于暴露状态(即没有镜像)。 但是,日志读取器代理仅复制已经记录到镜像的事务。 如果服务被迫中断,且镜像服务器承担主服务器的角色,则日志读取器代理将处理镜像,并开始选取新事务。 请注意,如果镜像落后于主体,复制延迟将会增加。 |
高安全性模式,没有自动故障转移 | 保证所有提交的事务都被写入到镜像磁盘上。 日志读取代理仅复制在镜像上已稳固的事务。 如果镜像不可用,则主体不允许数据库中的进一步活动;因此,日志读取器代理没有要复制的事务。 |