小编G.S*_*ith的帖子

SQL Server 2012+ 和服务代理:SSBDT 垃圾邮件在将消息发送到 NULL 会话句柄后结束会话

我主要是为了社区意识而发布此内容,但如果您认为除了我们正在解决的问题编码之外还有其他解决方案,请随时提供反馈。从我在这里提交的错误中交叉发布:https ://feedback.azure.com/forums/908035-sql-server/suggestions/37351609-sql-server-2012-service-broker-ssbdt-spam-endi

我们在某些 SQL 2014 和 2017 实例上遇到了问题,其中 ERRORLOG 重复发布如下消息:

2019-03-20 08:36:13.87 spid26s SSBDT:注册期间的对话定时器删除(did:4334D97F-9C96-47BC-AB1C-B9BE5888F89A:Initiator,OpType:CloseDialog OpResult:Null)

我研究了一下,一致认为微软表示这只是调试日志记录(https://social.msdn.microsoft.com/Forums/en-US/86b8a5c8-a882-496e-a4c4-99a5bbf2f935/ssbdt-dialog-timer-delete- during-dispatch-with-sql-server-2012-sp3?forum=sqlsetupandupgrade)。但是,我们的系统使用此日志记录间歇性地膨胀 ERRORLOG 并没有改变。经过调查,我发现了以下复制案例:

  1. SQL Server 2012+
  2. 跟踪标志 3605 开启。我们正在使用它来将死锁事件记录到 ERRORLOG。我们正计划切换到扩展事件,但出于这个原因,目前我们仍在使用它。关闭它意味着失去它。
  3. 在数据库中生成 Service Broker 对话
  4. SEND ON CONVERSATION NULL(将服务代理消息发送到 NULL 的会话句柄,该错误是缺少会话句柄,但问题不会开始,除非这种情况至少发生过一次)
  5. 结束任何对话。

当满足前 4 个要求并且每次发生 5 个时,它都会向 ERRORLOG 记录一条消息,类似于我上面发布的消息。这似乎发生在 SQL Server 重新启动之前。我附上了在新数据库中重新创建此示例的 SQL。在我们的例子中,我们获得了一个目标服务的会话句柄,但如果该服务不存在,我们就没有 NULL 处理并尝试发送消息。这个问题在 SQL2008R2 中不存在。我觉得对于给定的复制步骤,这应该被重新考虑为 SQL Server 中的错误。就我们而言,我们正在向代码中添加 NULL 处理。

编辑:我在 SQL2014 SP3 系统上观察到,即使您从未发送过 NULL 对话,ERRORLOG 中的此 SSBDT 对话消息也会在结束对话时发生。我不确定如何或为什么会出现这种情况,即使在您创建和结束对话时启动后也会立即发生。以前在其他测试系统上不需要。

产生这个问题的SQL:

-- 1. Turn on Trace Flag 3605. Required to generate …
Run Code Online (Sandbox Code Playgroud)

sql-server service-broker sql-server-2012 sql-server-2014

6
推荐指数
0
解决办法
599
查看次数