15

在服务器上设置了工作服务代理,我们正在迁移到新服务器,但我似乎无法在新机器上设置服务代理。

已经完成了(对我而言)显而易见的事情,例如在数据库上启用代理,删除路由、服务、合同、队列甚至消息类型并重新添加它们,将 ALTER QUEUE 设置为 STATUS ON

选择 * FROM sys.service_queues

给我一个队列列表,包括我自己的两个,显示为 activation_enabled、receive_enabled 等。

不用说队列不起作用。当我向他们发送消息时,没有任何内容进入,也没有任何内容出现。

有任何想法吗?我确定我错过了一些非常明显的事情......

4

2 回答 2

37

只是在黑暗中拍摄:

ALTER AUTHORIZATION ON DATABASE::[restored db name] TO [sa];

还原数据库的 dbo 是在原始服务器上创建 db 的 Windows SID。这可能是在新服务器上没有意义的本地 SID(例如 SERVERNAME\user)。此问题通常会影响已激活的过程并可能影响消息传递,这两个问题都是由于 SQL 无法模拟“dbo”而发生的。将 dbo 更改为有效的登录 SID(如 sa)将修复它。

如果这不能解决问题,那么您需要追踪消息的去向。如果它们留在 sys.transmission_queue 中,那么您必须检查 transmission_status。如果它们到达目标队列但未发生激活,请检查 ERRORLOG。如果它们消失了,则意味着您执行了即发即弃(SEND 后紧跟 END),因此您正在删除指示原因的错误消息。本文故障排除对话框包含更多提示。

最后但并非最不重要的一点是,尝试使用ssbdiagnose.exe

于 2010-05-28T15:39:17.517 回答
8

除了 Remus 的回答,您可能还想检查 restoreDB 的 BrokerEnabled 属性。每当您恢复数据库时,恢复的数据库的 BrokerEnabled 属性都会设置为 False。因此,没有任何东西会进入您的队列。为了解决这个问题:

  • 右键单击 SSMS 中的 restoreDB > 转到“属性”>“选项”> 向下滚动到“服务代理”组并验证“代理启用”属性的值。如果它设置为 False,请将其更改为 True,这应该可以解决您的问题。
于 2014-01-09T00:31:01.323 回答