复制和数据库镜像

数据库镜像可用于改进某些复制数据库的可用性。能否支持事务复制与数据库镜像结合使用依赖于所考虑的复制数据库。在与数据库镜像的结合中不支持对等复制。有关数据库镜像的详细信息,请参阅数据库镜像管理

下表列出了复制数据库和相应的对镜像的支持级别。

复制数据库

是否支持与数据库镜像结合使用

发布

是。

支持合并复制和事务复制与自动故障转移结合使用。连接到发布数据库的复制代理可自动故障转移到镜像的发布数据库。发生故障时,连接到发布数据库的代理将自动重新连接到新的主体数据库。

分发

否。

不支持镜像分发数据库。分发数据库是存储复制配置的地方,并且配置元数据与配置了分发服务器的服务器名称紧密结合。在故障转移到镜像数据库的过程中,该服务器名称将更改,但在分发数据库中存储的配置数据将指向旧的分发数据库服务器。

订阅

是。

从 SQL Server 2008 开始支持事务复制与手动故障转移和配置结合使用。连接到订阅数据库的复制代理不识别镜像。如果主体订阅数据库失败,则故障转移到第二个数据库要求您执行若干手动步骤来还原复制流。有关详细信息,请参阅 SQL Server 复制:使用数据库镜像提供高可用性(SQL Server 技术文章)。

有关无须重新配置复制就可恢复分发数据库或订阅数据库的信息,请参阅备份和还原复制的数据库

注意注意

故障转移后,镜像数据库变为主体数据库。在本主题中,“主体”和“镜像”始终是指原始主体和镜像。

将复制与数据库镜像一起使用的要求和注意事项

将复制与数据库镜像一起使用时,注意以下要求和注意事项:

  • 主体数据库和镜像数据库必须共享分发服务器。建议此处使用远程分发服务器,如果发布服务器有意外故障转移,则远程分发服务器可以提供较大的容错能力。

  • 发布服务器和分发服务器必须为 Microsoft SQL Server 2005 或更高版本。订阅服务器可以为任意版本,但早于 SQL Server 2005 的版本的合并复制请求订阅不支持故障转移,在这种情况下代理在订阅服务器中运行,并且早期版本的代理不能识别镜像。如果数据库从镜像数据库故障恢复到主体数据库,则对此类订阅服务器的复制将继续进行。

  • 对于合并复制,以及对于使用只读订阅服务器或排队更新订阅服务器的事务复制,复制支持对发布数据库进行镜像。不支持即时更新订阅服务器、Oracle 发布服务器、对等拓扑中的发布服务器和重新发布服务器。

  • 存在于数据库外部的元数据和对象不复制到镜像数据库,包括登录名、作业、链接服务器等等。如果要求镜像数据库中有元数据和对象,则必须手动复制它们。有关详细信息,请参阅在角色切换后管理登录名和作业

配置复制以及数据库镜像

配置复制和数据库镜像包括五个步骤。在下面的部分中将详细说明每个步骤。

  1. 配置发布服务器。

  2. 配置数据库镜像。

  3. 配置镜像数据库,使其使用与主体数据库相同的分发服务器。

  4. 配置用于故障转移的复制代理。

  5. 向复制监视器添加主体数据库和镜像数据库。

也可以相反的顺序执行步骤 1 和步骤 2。

配置发布数据库的数据库镜像

  1. 配置发布服务器:

    1. 建议使用远程分发服务器。有关配置分发的详细信息,请参阅配置分发

    2. 可以为快照发布及事务发布和/或合并发布启用数据库。对于将包含多种发布类型的镜像数据库,必须使用 sp_replicationdboption 为同一节点上的两种类型都启用数据库。例如,可以在主体数据库上执行下面的存储过程调用:

      exec sp_replicationdboption @dbname='<PublicationDatabase>', @optname='publish', @value=true
      exec sp_replicationdboption @dbname='<PublicationDatabase>', @optname='mergepublish', @value=true
      

      有关创建发布的详细信息,请参阅发布数据和数据库对象

  2. 配置数据库镜像。有关详细信息,请参阅如何配置数据库镜像会话 (SQL Server Management Studio)设置数据库镜像

  3. 配置镜像的分发。将镜像名称指定为发布服务器,并指定主体数据库使用的同一分发服务器和快照文件夹。例如,如果想使用存储过程配置复制,则可以在分发服务器上执行 sp_adddistpublisher,然后在镜像上执行 sp_adddistributor。对于 sp_adddistpublisher

    • @publisher 参数的值设置为镜像的网络名称。

    • @working_directory 参数的值设置为主体数据库使用的快照文件夹。

  4. 指定 –PublisherFailoverPartner 代理参数的镜像名称。下列代理在故障转移后需要使用此代理参数来标识镜像:

    • 快照代理(对于所有发布)

    • 日志读取器代理(对于所有事务发布)

    • 队列读取器代理(对于支持排队更新订阅的事务发布)

    • 合并代理(对于合并订阅)

    • SQL Server 复制侦听器(replisapi.dll:用于使用 Web 同步进行同步的合并订阅)

    • SQL 合并 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>'
    
  5. 向复制监视器添加主体数据库和镜像数据库。有关详细信息,请参阅如何从复制监视器中添加和删除发布服务器(复制监视器)

维护镜像发布数据库

维护镜像发布数据库与维护非镜像数据库基本相同,需要注意以下事项:

  • 管理和监视必须在活动服务器上进行。在 SQL Server Management Studio 中,发布仅出现在活动服务器的**“本地发布”**文件夹下方。例如,如果故障转移到镜像数据库,则发布显示在镜像数据库中,而不再显示在主体数据库中。如果数据库故障转移到镜像数据库,则可能需要手动刷新 Management Studio 和复制监视器才能反映更改。

  • 复制监视器会在对象树中同时显示主体数据库和镜像数据库的“发布服务器”节点。如果主体数据库位于活动服务器,则仅在复制监视器的主体数据库节点下显示发布信息。

    如果镜像数据库位于活动服务器:

    • 代理出错时,只在主体数据库节点上指出错误,而不在镜像数据库节点上指出。

    • 主体数据库不可用时,主体数据库节点和镜像数据库节点会显示相同的发布列表。这时,应对镜像数据库节点下的发布执行监视。

  • 当使用存储过程或复制管理对象 (RMO) 在镜像数据库上管理复制时,对于需要指定发布服务器名称的情况,必须指定已经为复制启用了数据库的实例的名称。若要确定相应的名称,请使用函数 publishingservername

    如果对发布数据库做了镜像,则镜像数据库中存储的复制元数据与主体数据库中存储的元数据相同。因此,对于为主体数据库上的复制启用的发布数据库,在镜像数据库上的系统表中存储的发布服务器实例名称是主体数据库的名称,而不是镜像数据库的名称。如果发布数据库故障转移到镜像数据库,则这种情况会影响复制的配置和维护。例如,如果故障转移后使用镜像数据库上的存储过程配置复制,并且希望添加对主体数据库上启用的发布数据库的请求订阅,则必须为 sp_addpullsubscriptionsp_addmergepullsubscription@publisher 参数指定主体数据库名称,而不是镜像数据库名称。

    如果故障转移到镜像数据库后在镜像数据库上启用发布数据库,则存储在系统表中的发布服务器实例名称是镜像数据库的名称;在此情况下,应将镜像数据库的名称用于 @publisher 参数。

    注意注意

    某些情况下,如 sp_addpublication,只有非 SQL Server 发布服务器支持 @publisher 参数;在这些情况下,它与 SQL Server 数据库镜像无关。

  • 若要在故障转移后在 Management Studio 中同步订阅:请同步来自订阅服务器的请求订阅以及来自活动发布服务器的推送订阅。

删除镜像后的复制行为

如果从已发布数据库中删除了数据库镜像,请谨记以下情况:

  • 如果主体数据库上的发布数据库不再有镜像,则复制依照原主体数据库无改变地继续工作。

  • 如果发布数据库从主体数据库故障转移到镜像数据库,而且镜像关系随后被禁用或删除,则复制代理不再对镜像数据库起作用。如果主体数据库永久丢失,请禁用复制,然后用指定为发布服务器的像镜重新配置复制。

  • 如果完全删除数据库镜像,镜像数据库将处于恢复状态,必须还原才能起作用。就复制而言,已恢复数据库的行为取决于是否指定了 KEEP_REPLICATION 选项。在将已发布数据库还原到创建备份的服务器以外的服务器上时,此选项强制还原操作保留复制设置。仅当另一个发布数据库不可用时才使用 KEEP_REPLICATION 选项。如果另一个发布数据库仍然完好且仍在复制,则不支持此选项。有关 KEEP_REPLICATION 的详细信息,请参阅 RESTORE (Transact-SQL)

日志读取器代理的行为

下表说明了日志读取器代理对于数据库镜像各种运行模式的行为。有关运行模式的详细信息,请参阅 Transact-SQL 设置和数据库镜像运行模式

运行模式

镜像数据库不可用时日志读取器代理的行为

具有自动故障转移的高安全性模式

如果镜像数据库不可用,则日志读取器代理将命令传播到分发数据库。直到镜像数据库回到联机状态并且具有来自主体数据库的所有事务,主体数据库才能故障转移到镜像数据库。

高性能模式

如果镜像数据库不可用,则主体数据库公开(即无镜像)运行。但是,日志读取器代理仅复制那些在镜像服务器上受保护的事务。如果是强制服务,并且镜像服务器充当主体服务器的角色,则日志读取器代理将依照镜像服务器工作并开始拾取新事务。有关详细信息,请参阅强制服务(可能造成数据丢失)

请注意,如果镜像服务器落后于主体服务器,就会加大复制滞后。

不带自动故障转移功能的高安全性模式

保证所有已提交的事务均在镜像服务器的磁盘上受到保护。日志读取器代理仅复制那些在镜像服务器上受保护的事务。如果镜像服务器不可用,则主体服务器禁止数据库中的进一步活动;因此,日志读取器代理没有事务可以复制。