修复链接服务器而不重新启动 SQL Server 实例

The*_*Wes 5 sql-server sql-server-2008-r2 linked-server sql-server-2012

问题: 有时夜间作业会失败,当我调查它时,这是跨链接服务器的查询失败的结果。但由于某种原因,该查询似乎以某种方式保持“开放”状态并导致后续失败。

糟糕的解决方案: 我发现解决此问题的唯一方法是重新启动实例,这似乎可以清除所有内容。但当它发生在生产中时,显然有点麻烦。

问题: 是否有人有重置打开状态的链接服务器的策略?我什至不太确定幕后发生了什么。

进行的其他检查: -

  • 在链接到的服务器上测试了查询。我可以选择那一侧的数据
  • 使用链接测试了服务器上的其他所有内容。那里一切工作正常,只是当它尝试跨该链接查询时失败。

唯一的解决方案是真正重新启动实例吗?

Joh*_*ner 5

根据您正在运行的语句以及您如何配置链接服务器,您可能会遇到这样的情况:您需要杀死一个孤立的分布式事务。要确定是否属于这种情况,请首先运行以下查询:

SELECT  DISTINCT request_owner_guid
FROM    sys.dm_tran_locks 
WHERE   request_session_id = -2
Run Code Online (Sandbox Code Playgroud)

如果这返回记录,那么您很可能实际上遇到了这种情况。要终止这些孤立事务,您必须对上述查询返回的每条记录运行以下语句:

KILL 'UOW'
Run Code Online (Sandbox Code Playgroud)

UOW是上述查询中返回的 request_owner_guid。

我遇到过这种情况,包括链接服务器问题和从 SQL Server 进程进行外部调用的作业。无论哪种情况,我都会发现外部进程会干扰(例如网络丢失、进程被终止或意外错误等),然后事务将无法在 SQL Server 上正确终止。SQL Server 不会知道事务实际上已失败,并且事情将一直保留在那里,直到您完成此过程或像您现在所做的那样反弹服务器。

希望有帮助。