对于一篇很长的帖子,我提前表示歉意,但我真的很想确保在向社区寻求帮助之前进行尽职调查,所以就这样吧。
我正在进行概念验证,目的是使用事务复制来维护我们数据库的“报告”副本。该设置将包括一个“发布者”服务器和一个单独的“订阅者”服务器。复制将是一个“拉”事务复制,分发服务器在订阅服务器上运行。再次:发布者 => 拉 =>(分发者 + 订阅者)
我们希望每台服务器上都有很多数据库,因此,为了模拟这种情况,我在发布者上恢复了 100 个数据库(每个大约 1 GB)。所有数据库都是相同的。
我写了一个脚本,它使我能够以自动方式设置复制(因为显然我不想手动执行数十次)。该脚本执行以下步骤:
为数据库启用复制(如果尚未启用):
为数据库创建日志读取器代理
为数据库创建发布(如果不存在)
为数据库创建快照代理(先不要运行它)
将文章添加到出版物
运行快照代理作业(并等待它完成)
创建订阅数据库(如果不存在)
在订阅数据库中添加订阅(如果不存在)
创建分销代理
我能够为我的大约 52 个数据库成功设置复制并且一切运行良好. 当我到达数据库#53 时,事情开始出错。快照创建成功,但日志读取器和分发代理失败。转到数据库 #54,现在一切都完全崩溃了。未创建快照,并且没有任何代理正在运行。我仔细检查了复制监视器和 SQL 代理作业以查找错误消息,但没有发现任何有用的信息。复制监视器简单地说:“代理关闭。有关详细信息,请参阅作业‘……’的 SQL Server 代理作业历史记录”。在详细信息部分,它说:“复制代理遇到故障。有关详细信息,请参阅之前的作业步骤历史消息或复制监视器”。接下来,我转到 SQL 代理作业并查看输出。在作业历史记录中,失败的步骤显示:“消息:复制代理遇到故障。有关详细信息,请参阅上一个作业步骤历史消息或复制监视器”。反过来,上一个步骤根本没有任何信息。只有“消息”一词,之后什么也没有。我还查看了 Windows 应用程序日志以查找任何错误, 但它只是重复我在复制监视器和代理作业历史记录中看到的相同消息。我在代理命令中添加了“–output”参数(在 SQL 代理作业步骤属性中),希望输出文件能为我提供更多信息,但没有创建输出文件,这让我相信代理甚至没有启动。只有“消息”这个词,后面什么也没有。我还查看了 Windows 应用程序日志以查找任何错误,但它只是重复了我在复制监视器和代理作业历史记录中看到的相同消息。我向代理命令(在 SQL 代理作业步骤属性中)添加了“–output”参数,希望输出文件能为我提供更多信息,但没有创建输出文件,这让我相信代理不会甚至开始。只有“消息”这个词,后面什么也没有。我还查看了 Windows 应用程序日志以查找任何错误,但它只是重复了我在复制监视器和代理作业历史记录中看到的相同消息。我向代理命令(在 SQL 代理作业步骤属性中)添加了“–output”参数,希望输出文件能为我提供更多信息,但没有创建输出文件,这让我相信代理不会甚至开始。
我在想我可能遇到了一些硬件限制,所以我检查了磁盘空间并且有足够的可用空间。我还检查了 RAM,它甚至没有使用 50%。
最后,真正让我着迷的是我能够从命令行手动运行所有代理。例如,我可以从 SQL Agent 快照作业复制粘贴参数,并使用这些参数从命令行运行 snapshot.exe——快照创建成功。日志阅读器和分发代理也是如此。
我在这里完全感到困惑,并感谢任何指向正确方向的指示。
最后说明(也许是唯一的一线希望):问题是完全可重现的。我可以成功设置我的 50 多个订阅,然后问题将始终围绕订阅号 52-53 开始。
谢谢!
我相信您遇到了此处 ( support.microsoft.com/kb/949296 ) 和此处 ( support.microsoft.com/kb/824422 ) 中描述的桌面堆问题。