Pet*_*ter 7 replication sql-server sql-server-2008-r2 transactional-replication
我有一个事务复制拓扑如下:
纽约出版数据库同一台服务器拥有分销商
纽约 - 订阅者
LON - 订阅者
HK - 订阅者
我们正在使用沼泽标准的单向事务复制。所有机器 SQL 2008 R2
快照可以很好地应用于所有订阅者,然后开始分发命令,正如您所期望的那样,但仅对于一个订阅者(伦敦),一大堆 2000-400 万个命令就会“卡住”。您可以在 msrepl_commands 中看到命令,在 msrepl_transaction 中可以看到事务。复制监视器显示有 xxxxx 未传递的命令。所有命令都被毫无问题地传递给其他 2 个订阅者。
问题是他们只是呆在那里。复制监视器说没有什么可复制的,什么也没有发生,它们只是停留在原地。我找到的唯一方法是拆除订阅并重新初始化!?!
我知道 NY 和 Lon 之间存在网络“信号”,我可以在 msrepl_errors 中看到存在一些通信故障。但是,我希望复制能够将它们恢复原状?分发代理运行良好。
我如何解决这个问题,并强制 SQL Server 选择这些命令并交付它们。
检查 的输出sp_helpsubscriptionerrors。我看到的一个问题是 DDL 命令;它们在复制中的处理方式不同,因此如果对发布服务器进行手动架构更改,它们有时可能会失败。由于事务不一致,特定的 DML 命令也可能在订阅者上失败。如果是这种情况,您可以使用名为“继续处理数据一致性错误”的分发代理配置文件,该配置文件将忽略重复键和其他错误。
延迟可能是导致问题的原因(根据 MS 的说法,延迟和吞吐量是事务复制中最重要的因素);您可以使用 来跟踪它sp_posttracertoken。日志读取器和分发代理都有可以调整的参数来弥补这一点。尝试降低这些值,尤其是在日志读取器上。
MaxDeliveredTransactions 是一次同步中应用于订阅服务器的最大推送或拉取事务数。值为 0 表示最大交易数量为无限。订阅服务器可以使用其他值来缩短从发布服务器拉取同步的持续时间。
CommitBatchThreshold 是在发出 COMMIT 语句之前要向订阅服务器发出的复制命令数。默认值为 1000。
MaxCmdsInTran 指定当日志读取器将命令写入分发数据库时分组到事务中的最大语句数。使用此参数允许日志读取器代理和分发代理在应用于订阅服务器时将发布服务器上的大型事务(由许多命令组成)划分为多个较小的事务。指定此参数可以减少分发服务器上的争用并减少发布服务器和订阅服务器之间的延迟。由于原始事务以较小的单元应用,因此订阅服务器可以在原始事务结束之前访问大型逻辑发布服务器事务的行,从而破坏了严格的事务原子性。默认值为 0,保留发布者的事务边界。