【问题标题】:Extended Events connection_id vs client_connection_id扩展事件 connection_id 与 client_connection_id
【发布时间】:2020-11-13 01:21:30
【问题描述】:

大家好,我想找到一种方法来识别为 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”吗?或其他解决方案来唯一地识别已执行的查询?

【问题讨论】:

  • 您能否更详细地解释一下“无法确定执行的查询”是什么意思?
  • 从一些 cmets 中,您是否尝试:(1) 捕获任何错误,以及 (2) 对于这些错误,确定是哪个查询生成了它们,并且可以选择 (3) 确定是否是您的查询还是别人的?您的问题不清楚 - 您能否分享您的扩展事件定义并说明它与您的查询有何关系?

标签: sql sql-server extended-events system-tables system-views


【解决方案1】:

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

查看这些可能有助于您建立联系。

【讨论】:

    【解决方案2】:

    client_connection_idin 扩展事件(根据 SSMS)

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

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

    您可以在扩展事件日志中找到连接 ID 以查看是否 如果日志的扩展事件发生在服务器上 连接 ID 已启用。您还可以在 连接环形缓冲区(SQL Server 中的连接故障排除 2008 with the Connectivity Ring Buffer)用于某些连接错误。 如果连接 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)))
    

    【讨论】:

    • 我正在尝试使用所有查询的 error_reported 创建一个扩展事件。然后使用告诉我这是来自 X 查询的标识符过滤 .xel 文件中的结果。因此,相关性类似于 client_connection_id -> FooQuery,然后是另一个具有相同查询 (FooQuery) 的 client_connection_id。我不知道我是否可以通过某种方式将标识符、值或字符串传递给扩展事件,以说明这是来自 FooQuery。
    • 我还可以创建一个扩展事件会话并在 where 子句中使用我的查询的当前 @@SPID 对其进行过滤,但是在查询执行(或错误)之后我必须停止扩展事件会话,因为会话 ID 仅在执行时是唯一的,在执行我的查询后,任何人都可以采用相同的 @@SPID。
    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多