是否可以使用 sp_WhoIsActive 查看阻止者的主机名或计算机名?

Ser*_*dia 3 sql-server t-sql sp-whoisactive

我正在使用 sp_WhoIsActive。

当服务器发生阻塞时,我想快速确定谁是罪魁祸首。

专栏login_name没有给我太多关于拦截器的信息,因为有数百人使用公司的应用程序并在相同的下登录login_name

我可以看到blocking_session_id,但这并没有告诉我阻止者的host_name.

还有一个专栏host_name,但这是一个waiter(不是阻止者)

那么有什么方法可以快速找到该用户host_namemachine name任何其他身份的用户是谁呢blocker

Ton*_*kle 5

是的,您只需将blocking_session_id 与拦截器的session_id 相关联即可。在以下输出中,您会看到会话 68 被会话 66 阻止,因此您只需查找会话 66 的数据即可。

为了最快地找到区块领导者,请务必使用以下参数,以便阻止最多其他会话的会话将位于顶部:

@find_block_leaders = 1, @sort_order = '[blocked_session_count] DESC'
Run Code Online (Sandbox Code Playgroud)

示例输出如下:

sp_whoisactive 
      @output_column_list='[session_id][block%][host_name][login_name]'
    , @find_block_leaders = 1
    , @sort_order = '[blocked_session_count] DESC'

session_id    blocking_session_id    blocked_session_count    host_name      login_name
66            NULL                    1                       host1          user1
68            66                      0                       host2          user2
Run Code Online (Sandbox Code Playgroud)

如果所有会话都来自应用程序服务器(这很常见),则主机名只是该应用程序服务器,并且 SQL Server 端无法查看与该连接关联的实际客户端计算机。应用服务器。如果您想跟踪类似的内容,您需要开始在应用程序服务器上记录相关信息,或者,如果您可以通过查看查询来弄清楚,请使用扩展事件或跟踪来查看该应用程序服务器中正在运行哪些查询会议。除非应用程序已经具备打开某些关联日志记录的管道,否则没有简单的方法。

请参阅sp_whoisactive:块的领导者

另外值得注意的是,SQL 客户端并不总是设置 host_name 属性,因此如果该属性为空,则只是因为应用程序将 SQL 连接配置为忽略该信息。