BLOB 合并复制期间临时数据库磁盘 I/O 高

Mar*_*vin 8 performance sql-server merge-replication

有一个用于复制 BLOB(类型image)的合并发布,对于我的数据大小获得了非常高的 tempdb 磁盘 I/O。出版物仅供下载,没有过滤器。

高磁盘 I/O 是由同步引起的(当没有订阅者同步时,一切正常),与订阅者数量密切相关。即使在同步之间发布者上没有更改数据时也会发生这种情况,这让我很困扰。

  • 复制表大小:7MB(总行数约为100)
  • tempdb I/O :写入约 30 MB/秒(日志和数据文件)
  • 订阅者数量:略高于 100,每个订阅者每 30 分钟同步一次(或多或少均匀)。
  • 保留期设置为 14 天

在发布服务器上使用 SQL Server 2008,在订阅服务器上使用 SQL Server 2005-2008R2。所有订阅者都使用 Web 同步。

此外,订阅者的同步需要很多时间,多次出现replmerg.log如下:

DatabaseReconciler, 2015/04/21 12:13:40.348, 3604, 25088,  S2,  
INFO: [WEBSYNC_PROTOCOL]  
Sending client ReconcilerPhase WebSyncReconcilerPhase_RegularDownload     

DatabaseReconciler, 2015/04/21 12:13:47.063, 3604, 25194,  S2,  
INFO: [WEBSYNC_PROTOCOL]  
Received server ReconcilerPhase WebSyncReconcilerPhase_LastRegularDownload
Run Code Online (Sandbox Code Playgroud)

试过@stream_blob_columns打开和关闭没有效果。

问题是:这是个好主意,用合并复制到这些斑点发送到用户?我们还有其他出版物(尽管它们没有 BLOB 列),其中包含大量数据而没有 tempdb 问题。是 SQL Server 缺陷还是设置不当?

发布者和分发者在同一个实例 SQL Server 2008 SP4 上,无法确定订阅者,其中一些可能不是最新的。无论如何,如果它似乎有帮助,我可以准备一个测试环境,其中几乎没有订阅者拥有受控版本。

确认,由于执行sys.sp_MSenumgenerations90. 检查MSMerge_genhistory表,发现超过 120 万条记录pubid为空。

找到了与复制大师的对话

执行sp_mergemetadataretentioncleanup没有效果。

在这样的情况下找到了一个评论(行太多MSmerge_genhistory),其中删除pubid为 null 和genstatus=1 的行有助于修复复制。

删除的行为pubid空(意味着所有订阅服务器都已同步,哪些不是 - 将在“手动模式”下重新初始化)并且磁盘 IO 再次恢复正常!

我有一种感觉,这种情况可能是由以下事实造成的,即我的所有订阅者都是通过 WebSync 匿名的,并且其中大多数具有相同的主机名。我会尝试检查,如果-hostnamekey 有助于不增加MSmerge_genhistory.

RLF*_*RLF 1

有一个 TechNet 博客讨论了 SQL Server 2008 或更高版本服务器上的 Blob 的一些合并复制问题。

http://blogs.technet.com/b/claudia_silva/archive/2011/10/31/replication-watch-out-for-stream-blob-columns-when-setting-up-replication-on-your-sql- 2008-服务器.aspx

请注意,作者警告了当存在 SQL Server 2005 客户端(例如您所拥有的客户端)时要使用哪些设置。