You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Service Broker队列滞留EndDialog消息,有无无需重置Broker的替代方案?

解决Service Broker队列残留EndDialog消息的可行方案

前置信息确认

先执行以下查询,精准获取这8条异常会话的完整信息,为后续操作提供依据:

SELECT 
    ce.conversation_handle,
    ce.state_desc,
    ce.far_service,
    ce.far_broker_instance,
    qe.message_sequence_number,
    qe.service_name
FROM sys.conversation_endpoints ce
JOIN sys.transmission_queue qe ON ce.conversation_handle = qe.conversation_handle
WHERE ce.state_desc = 'DISCONNECTED_INBOUND'
AND qe.message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog';

方案1:单条会话分批清理+锁超时控制

批量执行END CONVERSATION易引发锁竞争,尝试逐条处理并设置锁超时:

SET LOCK_TIMEOUT 30000; -- 设置30秒锁超时,避免无限等待
-- 替换为查询到的单个conversation_handle
END CONVERSATION '0xXXXXXX...' WITH CLEANUP;

单条执行成功后,再依次处理剩余会话。

方案2:排查并解除阻塞会话

查询是否有会话阻塞了清理操作:

SELECT 
    blocking_session_id,
    session_id,
    command,
    wait_type,
    wait_resource
FROM sys.dm_exec_requests
WHERE command LIKE '%END CONVERSATION%' OR blocking_session_id <> 0;

若发现阻塞会话,结合业务情况谨慎终止(生产环境需确认无业务影响):

KILL <blocking_session_id>;

方案3:检查未提交事务

未提交的长期事务可能导致会话无法清理,执行命令排查:

DBCC OPENTRAN;

若存在未提交事务,协调业务方提交/回滚后,再尝试清理会话。

方案4:禁用队列后清理

先尝试禁用目标队列(需先停止依赖该队列的业务服务):

ALTER QUEUE [YourQueueName] WITH STATUS = OFF;

禁用后执行END CONVERSATION ... WITH CLEANUP;,完成后重新启用队列:

ALTER QUEUE [YourQueueName] WITH STATUS = ON;

方案5:最后手段——NEW_BROKER的安全执行

若以上方案均无效,不得不使用NEW_BROKER,需按以下步骤降低影响:

  1. 先完成数据库全量备份,确保数据可恢复
  2. 选择业务低峰期执行命令:
ALTER DATABASE [YourDBName] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;

该操作会重置Service Broker、清除所有会话和队列消息,但不会影响数据库其他业务数据。执行后需重新配置Service Broker的端点、服务及路由规则。


内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:35:41