0

大家好,我想找到一种方法来识别为 Microsoft SQL Server 中的扩展事件执行的查询(仅使用执行的查询过滤扩展事件)

如果我像这样查询 SQL Server 中的系统视图:

SELECT  session_id, connection_id
FROM sys.dm_exec_requests
WHERE session_id = @@SPID

我得到了当前执行的查询的 connection_id,它在 SQL Server 重新启动之前是唯一的。

但是扩展事件有一个不同的值,称为“sqlserver.client_connection_id”,它与“sys.dm_exec_requests”表中的“connection_id”不同。

你知道我在哪里可以找到系统表中的“sqlserver.client_connection_id”吗?或其他解决方案来唯一地识别已执行的查询?

4

2 回答 2

1

client_connection_id扩展事件中(根据 SSMS)

提供客户端在连接时提供的可选标识符

并且是SqlConnection.ClientConnectionId,旨在支持解决客户端连接问题。

如果启用了用于记录连接 ID 的扩展事件,您可以在扩展事件日志中找到连接 ID,以查看故障是否发生在服务器上。对于某些连接错误,您还可以在连接环形缓冲区(SQL Server 2008 中使用连接环形缓冲区的连接故障排除)中找到连接 ID。如果连接 ID 不在连接环缓冲区中,则可以假定网络错误。

所以这个 id 关联了连接尝试的客户端和服务器端。对于成功的连接,sys.dm_exec_connections 和 sys.dm_exec_sessions 中的一行将使用不同的 id 创建。

我正在尝试使用所有查询的 error_reported 创建扩展事件。然后使用告诉我这是来自 X 查询的标识符过滤 .xel 文件中的结果。

您可以在 error_reported 事件中捕获查询,例如:

CREATE EVENT SESSION [errors] ON SERVER 
ADD EVENT sqlserver.error_reported(
    ACTION
    (
       sqlserver.client_app_name,
       sqlserver.session_id,
       sqlserver.sql_text
    )
WHERE ([severity]>=(11)))
于 2020-07-23T12:57:44.237 回答
0

默认情况下,Extended Evets 会跟踪实例上的所有连接和活动。您在定义中的过滤器将限制它。

sqlserver.client_connection_id 包括来自所有查询的所有值 - 因此,如果您确实知道客户端连接 ID,那么您可以识别这些结果。

我不清楚您要使用扩展事件过滤什么?您是否希望查看从何处执行特定查询或跟踪特定连接上的所有查询?

您可以获得相同连接信息的其他地方是:

SELECT * FROM sys.dm_exec_connections
SELECT * FROM sys.dm_exec_sessions
SELECT * FROM sys.dm_exec_requests

查看这些可能会帮助您建立联系。

于 2020-07-23T12:35:00.053 回答