快照复制和事务复制的备份和还原策略

设计快照复制和事务性复制的备份和还原策略时,需要考虑三个方面:

  • 要备份的数据库。
  • 事务性复制的备份设置。
  • 还原数据库所需的步骤,取决于所选的复制类型和选项。

本主题在下面三部分中分别介绍了这三个方面。有关备份和还原 Oracle 发布的信息,请参阅Oracle 发布服务器的备份和还原

备份数据库

对于快照复制和事务性复制,应定期备份下列数据库:

  • 发布服务器上的发布数据库。
  • 分发服务器上的分发数据库。
  • 每台订阅服务器上的订阅数据库。
  • 发布服务器、分发服务器和所有订阅服务器上的 mastermsdb 系统数据库。当备份这些数据库中的一个数据库或相关的复制数据库时,应同时备份这些数据库。例如,在备份发布数据库的同时备份发布服务器上的 mastermsdb 数据库。还原发布数据库时,请确保 mastermsdb 数据库在复制配置和设置方面与发布数据库一致。

如果执行定期日志备份,则在日志备份中应捕获所有与复制相关的更改。如果不执行日志备份,则每次与复制相关的设置发生更改,就应执行一次备份。有关详细信息,请参阅需要已更新备份的常用操作

事务性复制的备份设置

事务性复制包括 sync with backup 选项,可以对分发数据库和发布数据库设置此选项:

  • 建议在所有情况下都对分发数据库设置此选项。
    对分发数据库设置此选项可以确保发布数据库日志中的事务在分发数据库上备份之前不会被截断。分发数据库可以还原为上次的备份,任何缺少的事务都会从发布数据库传递到分发数据库;复制将继续,不受任何影响。
    对分发数据库设置此选项不会影响复制滞后时间。但是,它将推迟截断发布数据库上的日志,直到分发数据库中的相应事务备份完成(这会导致发布数据库中生成较大的事务日志)。
  • 如果应用程序允许额外的滞后时间,建议对发布数据库设置此选项。
    对发布数据库设置此选项可以确保事务在发布数据库上备份之前不会传递到分发数据库。这样,上次的发布数据库备份就可以在发布服务器上还原,并且不存在分发数据库中包含已还原发布数据库没有的事务的情况。
    由于事务在发布服务器上备份之前无法传递到分发数据库,因此会影响滞后时间和吞吐量。例如,如果事务日志每五分钟备份一次,则在发布服务器上提交事务与将事务依次传递到分发数据库和订阅服务器之间,将产生额外的五分钟滞后时间。
    ms152560.note(zh-cn,SQL.90).gif注意:
    sync with backup 选项确保发布数据库和分发数据库之间的一致,但不能保证数据不丢失。例如,如果事务日志丢失,则在发布数据库或分发数据库中没有自上次事务日志备份后提交的事务。这与非复制数据库的行为相同。

设置 sync with backup 选项

还原复制中涉及的数据库

如果最近的备份可用并遵循正确的步骤,则可以还原复制拓扑中的所有数据库。发布数据库的还原步骤取决于复制类型和所用的选项,但所有其他数据库的还原步骤与类型和选项无关。

复制支持将复制的数据库还原到从中创建备份的同一服务器和数据库。如果将复制数据库的备份还原到其他服务器或数据库,则无法保留复制设置。在这种情况下,您必须在还原备份后重新创建所有发布和订阅。

发布服务器

下面介绍了下列类型复制的还原步骤:

  • 快照复制
  • 只读事务性复制
  • 带有更新订阅的事务性复制
  • 对等事务性复制

本部分还介绍了 msdbmaster 数据库的还原步骤,这些步骤与所有四种复制类型的还原步骤相同。

发布数据库:快照复制

  1. 还原发布数据库的最新备份。转到步骤 2。
  2. 发布数据库备份是否包含所有发布和订阅的最新配置?如果是,则还原完成。如果不是,则转到步骤 3。
  3. 从发布服务器、分发服务器和订阅服务器中删除复制配置,然后重新创建配置。还原完成。
    有关删除复制的详细信息,请参阅删除复制sp_removedbreplication (Transact-SQL)

发布数据库:只读事务性复制

  1. 还原发布数据库的最新备份。转到步骤 2。
  2. 是否在故障发生前对发布数据库启用了 sync with backup 设置?如果是,则转到步骤 3;如果不是,则转到步骤 5。
    如果设置已启用,查询 SELECT DATABASEPROPERTYEX('<PublicationDatabaseName>', 'IsSyncWithBackup'); 将返回“1”。
  3. 还原的备份是否已完成并且是最新的?是否包含所有发布和订阅的最新配置?如果是,则还原完成。如果不是,则转到步骤 4。
  4. 还原的发布数据库中的配置信息不是最新的,因此必须确保订阅服务器包含分发数据库中所有未完成的命令,然后删除并重新创建复制配置:
    1. 运行分发代理,直到所有订阅服务器与分发数据库中的未完成命令同步。通过使用复制监视器中的**“未分发的命令”**选项卡或通过查询分发数据库中的 MSdistribution_status 视图,确保所有命令都已传递到订阅服务器。转到步骤 b。
      有关运行分发代理的详细信息,请参阅如何启动和停止复制代理 (SQL Server Management Studio)Programming Replication Agent Executables
      有关验证命令的详细信息,请参阅How to: View Replicated Commands and Other Information in the Distribution Database (Replication Transact-SQL Programming)如何查看与订阅相关的代理的信息并执行此代理的任务(复制监视器)
    2. 从发布服务器、分发服务器和订阅服务器中删除复制配置,然后重新创建配置。重新创建订阅时,指定订阅服务器已包含数据。还原完成。
      有关删除复制的详细信息,请参阅删除复制sp_removedbreplication (Transact-SQL)
      有关指定订阅服务器已包含数据的详细信息,请参阅如何手动初始化订阅 (SQL Server Management Studio)How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)
  5. 如果未对发布数据库设置 sync with backup 选项,则还原备份中没有包括的事务可能已传递到分发服务器和订阅服务器。现在必须确保订阅服务器包含分发数据库中所有未完成的命令,然后手动将还原备份中未包含的所有事务应用到发布数据库:
    ms152560.note(zh-cn,SQL.90).gif重要提示:
    执行此进程会导致已发布的表所还原到的时点晚于从备份还原的其他未发布表的时点。
    1. 运行分发代理,直到所有订阅服务器与分发数据库中的未完成命令同步。通过使用复制监视器中的**“未分发的命令”**选项卡或通过查询分发数据库中的 **MSdistribution\_status** 视图,确保所有命令都已传递到订阅服务器。转到步骤 b。 有关运行分发代理的详细信息,请参阅[如何启动和停止复制代理 (SQL Server Management Studio)](ms151783\(v=sql.90\).md) 和[Programming Replication Agent Executables](ms147886\(v=sql.90\).md)。 有关验证命令的详细信息,请参阅[How to: View Replicated Commands and Other Information in the Distribution Database (Replication Transact-SQL Programming)](ms147306\(v=sql.90\).md)和[如何查看与订阅相关的代理的信息并执行此代理的任务(复制监视器)](ms152749\(v=sql.90\).md)。 2. 使用 [tablediff 实用工具](ms162843\(v=sql.90\).md)或其他工具手动同步发布服务器与订阅服务器,这使您可以从订阅数据库恢复发布数据库备份中未包含的数据。转到步骤 c。 有关 **tablediff** 实用工具的详细信息,请参阅[How to: Compare Replicated Tables for Differences (Replication Programming)](ms147919\(v=sql.90\).md)。 3. 还原的备份是否已完成并且是最新的?是否包含所有发布和订阅的最新配置?如果是,则执行存储过程 [sp\_replrestart (Transact-SQL)](ms174390\(v=sql.90\).md),使发布服务器的元数据与分发服务器的元数据重新同步。还原完成。如果不是,则转到步骤 d。 4. 从发布服务器、分发服务器和订阅服务器中删除复制配置,然后重新创建配置。重新创建订阅时,指定订阅服务器已包含数据。还原完成。 有关删除复制的详细信息,请参阅[删除复制](ms152757\(v=sql.90\).md)和 [sp\_removedbreplication (Transact-SQL)](ms188734\(v=sql.90\).md)。 有关指定订阅服务器已包含数据的详细信息,请参阅[如何手动初始化订阅 (SQL Server Management Studio)](ms151246\(v=sql.90\).md) 和[How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)](ms147897\(v=sql.90\).md)。

发布数据库:带有更新订阅的事务性复制

  1. 还原发布数据库的最新备份。转到步骤 2。
  2. 运行分发代理,直到所有订阅服务器与分发数据库中的未完成命令同步。通过使用复制监视器中的**“未分发的命令”**选项卡或通过查询分发数据库中的 MSdistribution_status 视图,确保所有命令都已传递到订阅服务器。转到步骤 3。
    有关运行分发代理的详细信息,请参阅如何启动和停止复制代理 (SQL Server Management Studio)Programming Replication Agent Executables
    有关验证命令的详细信息,请参阅How to: View Replicated Commands and Other Information in the Distribution Database (Replication Transact-SQL Programming)如何查看与订阅相关的代理的信息并执行此代理的任务(复制监视器)
  3. 如果使用的是排队更新订阅,请连接到每台订阅服务器,并从订阅数据库中的 MSreplication_queue 表中删除所有行。转到步骤 4。
    ms152560.note(zh-cn,SQL.90).gif注意:
    使用排队更新订阅时,如果任何表包含标识列,则必须确保还原后指定正确的标识范围。有关详细信息,请参阅复制标识列
  4. 现在必须确保订阅服务器包含分发数据库中所有未完成的命令,然后手动将还原备份中未包含的所有事务应用到发布数据库:
    ms152560.note(zh-cn,SQL.90).gif重要提示:
    执行此进程会导致已发布的表所还原到的时点晚于从备份还原的其他未发布表的时点。
    1. 运行分发代理,直到所有订阅服务器与分发数据库中的未完成命令同步。通过使用复制监视器或通过查询分发数据库中的 **MSdistribution\_status** 视图,确保所有命令都已传递到订阅服务器。转到步骤 b。 2. 使用 [tablediff 实用工具](ms162843\(v=sql.90\).md)或其他工具手动同步发布服务器与订阅服务器,这使您可以从订阅数据库恢复发布数据库备份中未包含的数据。转到步骤 c。 有关 **tablediff** 实用工具的详细信息,请参阅[How to: Compare Replicated Tables for Differences (Replication Programming)](ms147919\(v=sql.90\).md)。 3. 还原的备份是否已完成并且是最新的?是否包含所有发布和订阅的最新配置?如果是,则执行存储过程 [sp\_replrestart (Transact-SQL)](ms174390\(v=sql.90\).md),使发布服务器的元数据与分发服务器的元数据重新同步。还原完成。如果不是,则转到步骤 d。 4. 从发布服务器、分发服务器和订阅服务器中删除复制配置,然后重新创建配置。重新创建订阅时,指定订阅服务器已包含数据。还原完成。 有关删除复制的详细信息,请参阅[删除复制](ms152757\(v=sql.90\).md)和 [sp\_removedbreplication (Transact-SQL)](ms188734\(v=sql.90\).md)。 有关指定订阅服务器已包含数据的详细信息,请参阅[如何手动初始化订阅 (SQL Server Management Studio)](ms151246\(v=sql.90\).md) 和[How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)](ms147897\(v=sql.90\).md)。

发布数据库:对等事务性复制

在下列步骤中,发布数据库 A、B 和 C 位于对等事务性复制拓扑中。数据库 A 和 C 在线,并且可以正常工作;数据库 B 是要还原的数据库。

  1. 运行分发代理同步数据库 A 和 C 上的订阅。转到步骤 2。
    有关运行分发代理的详细信息,请参阅如何启动和停止复制代理 (SQL Server Management Studio)Programming Replication Agent Executables
  2. 如果 B 使用的分发数据库仍可用,请运行分发代理同步数据库 B 和数据库 A 之间的订阅以及数据库 B 和数据库 C 之间的订阅。转到步骤 3。
  3. 通过在 B 的分发数据库上执行 sp_removedistpublisherdbreplication (Transact-SQL),从 B 使用的分发数据库中删除元数据。
  4. 在数据库 A 和 C 上,删除对数据库 B 上的发布的订阅。转到步骤 5。
    有关删除订阅的详细信息,请参阅订阅发布
  5. 对数据库 A 执行日志备份或完整备份。转到步骤 6。
  6. 在数据库 B 上还原数据库 A 的备份。数据库 B 现在包含数据库 A 中的数据,但没有数据库 A 的复制配置。将备份还原到其他服务器时,将删除复制,因为复制已从数据库 B 中删除。转到步骤 7。
  7. 在数据库 B 上重新创建发布,然后在数据库 A 和 B 之间重新创建订阅(涉及数据库 C 的订阅将在后面的阶段进行处理):
    1. 在数据库 B 上重新创建发布。转到步骤 b。
    2. 在数据库 B 上重新创建对数据库 A 上的发布的订阅,指定该订阅应使用备份进行初始化(sp_addsubscription (Transact-SQL)@sync_type 参数的值为 initialize with backup)。转到步骤 c。
    3. 在数据库 A 上重新创建对数据库 B 上的发布的订阅,指定订阅服务器已包含数据(sp_addsubscription (Transact-SQL)@sync_type 参数的值为 replication support only)。转到步骤 8。
      执行步骤 a-c 最简单的方法是使用配置对等拓扑向导。有关详细信息,请参阅如何配置对等事务复制 (SQL Server Management Studio)。还可以使用存储过程;有关详细信息,请参阅How to: Configure Peer-to-Peer Transactional Replication (Replication Transact-SQL Programming)
  8. 运行分发代理同步数据库 A 和 B 上的订阅。如果已发布的表中有标识列,则转到步骤 9。如果没有,则转到步骤 10。
  9. 还原后,为数据库 A 中的每个表指定的标识范围在数据库 B 中也可以使用。确保还原的数据库 B 已收到发生故障的数据库 B 中的且传播到数据库 A 和数据库 C 的所有更改;然后重设每个表的标识范围种子。
    1. 在数据库 B 上执行 sp_requestpeerresponse (Transact-SQL),并检索输出参数 @request_id。转到步骤 b。
    2. 默认情况下,分发代理设置为连续运行,因此令牌将自动发送到所有节点。如果分发代理未以连续模式运行,请运行该代理。有关详细信息,请参阅Programming Replication Agent Executables如何启动和停止复制代理 (SQL Server Management Studio)。转到步骤 c。
    3. 执行 sp_helppeerresponses (Transact-SQL),并使用在步骤 b 中检索到的 @request_id 值。一直等到所有节点都指示已接收到对等请求。转到步骤 d。
    4. 使用 DBCC CHECKIDENT 在数据库 B 中对每个表重设种子以确保使用适当的范围。转到步骤 10。
      有关管理标识范围的详细信息,请参阅复制标识列中的“指定手动标识范围管理的范围”部分。
  10. 此时,虽然数据库 B 和数据库 C 没有直接连接,但它们将通过数据库 A 接收更改。若要连接数据库 B 和数据库 C,请完成步骤 11-13。
  11. 停止系统。停止系统包括停止所有节点上已发布表上的活动,并确保每个节点已收到来自所有其他节点的所有更改:
    1. 停止对等拓扑中已发布表上的所有活动。转到步骤 b。
    2. 在数据库 B 上执行 sp_requestpeerresponse (Transact-SQL),并检索输出参数 @request_id。转到步骤 c。
    3. 默认情况下,分发代理设置为连续运行,因此令牌将自动发送到所有节点。如果分发代理未以连续模式运行,请运行该代理。转到步骤 d。
    4. 执行 sp_helppeerresponses (Transact-SQL),提供在步骤 b 中检索到的 @request_id 值。请等待所有节点都指示已接收到对等请求。转到步骤 12。
  12. 在数据库 B 和 C 之间重新创建订阅:
    1. 在数据库 B 上重新创建对数据库 C 上的发布的订阅,指定该订阅应使用备份进行初始化。转到步骤 b。
    2. 在数据库 C 上重新创建对数据库 B 上的发布的订阅,指定订阅服务器已包含数据。转到步骤 13。
  13. 运行分发代理同步数据库 B 和 C 上的订阅。还原完成。

msdb 数据库(发布服务器)

  1. 还原 msdb 数据库的最新备份。
  2. 还原的备份是否已完成并且是最新的?是否包含所有发布和订阅的最新配置?如果是,则恢复完成。如果不是,则转到步骤 3。
  3. 从复制脚本重新创建订阅清除作业。恢复完成。

master 数据库(发布服务器)

  1. 还原 master 数据库的最新备份。
  2. 确保数据库在复制配置和设置方面与发布数据库一致。

分发服务器上的数据库

分发数据库

  1. 还原分发数据库的最新备份。
  2. 是否在故障发生前对分发数据库启用了 sync with backup 设置?如果是,则转到步骤 3,如果不是,则转到步骤 4。
    如果设置已启用,查询 SELECT DATABASEPROPERTYEX('<DistributionDatabaseName>', 'IsSyncWithBackup'); 将返回“1”。
  3. 还原的备份是否已完成并且是最新的?是否包含所有发布和订阅的最新配置?如果是,则恢复完成。如果不是,则转到步骤 4。
  4. 已还原分发数据库中的配置信息不是最新的,或未对分发数据库设置 sync with backup 选项(还原后,分发数据库可能会丢失那些在发布服务器上提交但尚未传递到订阅服务器的事务)。删除并重新创建复制,然后进行验证:
    1. 从发布服务器、分发服务器和订阅服务器中删除复制配置,然后重新创建配置。重新创建订阅时,指定订阅服务器已包含数据。转到步骤 b。
      有关删除复制的详细信息,请参阅删除复制sp_removedbreplication (Transact-SQL)
      有关指定订阅服务器已包含数据的详细信息,请参阅如何手动初始化订阅 (SQL Server Management Studio)How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)
    2. 将所有发布标记为要验证。重新初始化所有未通过验证的订阅。恢复完成。
      有关验证的详细信息,请参阅验证已复制的数据
      有关重新初始化的详细信息,请参阅重新初始化订阅

msdb 数据库(分发服务器)

  1. 还原 msdb 数据库的最新备份。
  2. 还原的备份是否已完成并且是最新的?是否包含所有发布和订阅的最新配置?如果是,则恢复完成。如果不是,则转到步骤 3。
  3. 从发布服务器、分发服务器和订阅服务器中删除复制配置,然后重新创建配置。重新创建订阅时,指定订阅服务器已包含数据。转到步骤 4。
    有关删除复制的详细信息,请参阅删除复制sp_removedbreplication (Transact-SQL)
    有关指定订阅服务器已包含数据的详细信息,请参阅如何手动初始化订阅 (SQL Server Management Studio)How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)
  4. 将所有发布标记为要验证。重新初始化所有验证失败的订阅。恢复完成。
    有关验证的详细信息,请参阅验证已复制的数据
    有关重新初始化的详细信息,请参阅重新初始化订阅

master 数据库(分发服务器)

  1. 还原 master 数据库的最新备份。
  2. 确保数据库在复制配置和设置方面与发布数据库一致。

订阅服务器上的数据库

订阅数据库

  1. 最新的订阅数据库备份是否晚于分发数据库上的最大分发保持期设置(这将决定分发服务器中是否仍具有使订阅服务器保持最新所需的所有命令)?如果是,则转到步骤 2。如果不是,则重新初始化订阅;恢复完成。
    若要确定最大分发保持期设置,请执行 sp_helpdistributiondb (Transact-SQL),并从 max_distretention 列检索值(此值以小时为单位)。
    有关重新初始化订阅的详细信息,请参阅如何重新初始化订阅 (SQL Server Management Studio)How to: Reinitialize a Subscription (Replication Transact-SQL Programming)
  2. 还原订阅数据库的最新备份。转到步骤 3。
  3. 如果订阅数据库仅包含推送订阅,则转到步骤 4。如果订阅数据库包含任何请求订阅:是否为最新的订阅信息?该信息是否包含故障发生时设置的所有表和选项?如果是,则转到步骤 4。如果不是,则重新初始化订阅;恢复完成。
  4. 运行分发代理同步订阅服务器。恢复完成。
    有关运行分发代理的详细信息,请参阅如何启动和停止复制代理 (SQL Server Management Studio)Programming Replication Agent Executables

msdb 数据库(订阅服务器)

  1. 还原 msdb 数据库的最新备份。是否在此订阅服务器上使用请求订阅?如果不是,则还原完成。如果是,则转到步骤 2。
  2. 还原的备份是否已完成并且是最新的?是否包含所有请求订阅的最新配置?如果是,则恢复完成。如果不是,则转到步骤 3。
  3. 删除并重新创建请求订阅。重新创建订阅时,指定订阅服务器已包含数据。还原完成。
    有关删除订阅的详细信息,请参阅订阅发布
    有关指定订阅服务器已包含数据的详细信息,请参阅如何手动初始化订阅 (SQL Server Management Studio)How to: Initialize a Subscription Manually (Replication Transact-SQL Programming)

master 数据库(订阅服务器)

  1. 还原 master 数据库的最新备份。
  2. 确保数据库在复制配置和设置方面与发布数据库一致。

请参阅

概念

备份和还原复制的数据库
配置分发
发布数据和数据库对象
订阅发布
初始化订阅
同步数据

其他资源

在 SQL Server 中备份和还原数据库

帮助和信息

获取 SQL Server 2005 帮助