【问题标题】:SQL Server extended events: track exception with SP callSQL Server 扩展事件:使用 SP 调用跟踪异常
【发布时间】:2018-01-26 13:41:55
【问题描述】:

我需要跟踪失败的远程过程调用(RPC 启动/完成事件)。

  • 带有所有输入/输出参数的精确过程调用语句
  • 过程抛出异常

我尝试了什么:

  • 轻松跟踪确切的 RPC 开始/完成事件

  • 使用 error_reported 事件可以轻松跟踪错误

但是,我找不到如何在一个地方同时跟踪两者。

附:我不能使用输出参数返回错误并使用 RPC 完成事件进行跟踪。

【问题讨论】:

    标签: sql-server extended-events


    【解决方案1】:

    如果您在事件会话中添加 TRACK_CAUSALITY 选项,它将添加一个操作,允许您关联由同一事件发生而生成的事件。这是我刚刚制作的一个示例事件会话:

    CREATE EVENT SESSION [sp errors] ON SERVER 
    ADD EVENT sqlserver.error_reported,
    ADD EVENT sqlserver.module_end(SET collect_statement=(1)),
    ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1))
    ADD TARGET package0.ring_buffer
    WITH (
        MAX_MEMORY=4096 KB,
        EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY=30 SECONDS,
        MAX_EVENT_SIZE=0 KB,
        MEMORY_PARTITION_MODE=NONE,
        TRACK_CAUSALITY=ON,
        STARTUP_STATE=OFF
    )
    GO
    

    然后我创建了一个带有被零除错误的存储过程并调用它。这是我在环形缓冲区中得到的(截断为相关事件):

    <event name="error_reported" package="sqlserver" timestamp="2018-01-26T15:44:58.652Z">
        <data name="error_number">
          <type name="int32" package="package0"></type>
          <value>8134</value>
        </data>
        <data name="severity">
          <type name="int32" package="package0"></type>
          <value>16</value>
        </data>
        <data name="state">
          <type name="int32" package="package0"></type>
          <value>1</value>
        </data>
        <data name="user_defined">
          <type name="boolean" package="package0"></type>
          <value>false</value>
        </data>
        <data name="category">
          <type name="error_category" package="sqlserver"></type>
          <value>2</value>
          <text><![CDATA[SERVER]]></text>
        </data>
        <data name="destination">
          <type name="error_destination" package="sqlserver"></type>
          <value>0x00000002</value>
          <text><![CDATA[USER]]></text>
        </data>
        <data name="is_intercepted">
          <type name="boolean" package="package0"></type>
          <value>false</value>
        </data>
        <data name="message">
          <type name="unicode_string" package="package0"></type>
          <value><![CDATA[Divide by zero error encountered.]]></value>
        </data>
        <action name="attach_activity_id_xfer" package="package0">
          <type name="activity_id_xfer" package="package0"></type>
          <value>110CE72A-3B30-4086-BD7E-9E2E3734C803-0</value>
        </action>
        <action name="attach_activity_id" package="package0">
          <type name="activity_id" package="package0"></type>
          <value>A3050AC2-36EF-493F-9E37-BF7884EF55DC-1</value>
        </action>
      </event>
      <event name="module_end" package="sqlserver" timestamp="2018-01-26T15:44:58.657Z">
        <data name="source_database_id">
          <type name="uint32" package="package0"></type>
          <value>2</value>
        </data>
        <data name="object_id">
          <type name="int32" package="package0"></type>
          <value>-1530582118</value>
        </data>
        <data name="duration">
          <type name="uint64" package="package0"></type>
          <value>6025</value>
        </data>
        <data name="row_count">
          <type name="uint64" package="package0"></type>
          <value>0</value>
        </data>
        <data name="line_number">
          <type name="int32" package="package0"></type>
          <value>1</value>
        </data>
        <data name="offset">
          <type name="int32" package="package0"></type>
          <value>0</value>
        </data>
        <data name="offset_end">
          <type name="int32" package="package0"></type>
          <value>-1</value>
        </data>
        <data name="object_type">
          <type name="ansi_string" package="package0"></type>
          <value><![CDATA[P ]]></value>
        </data>
        <data name="object_name">
          <type name="unicode_string" package="package0"></type>
          <value><![CDATA[#foo____________________________________________________________________________________________________________________00005935]]></value>
        </data>
        <data name="statement">
          <type name="xml" package="package0"></type>
          <value>exec #foo</value>
        </data>
        <action name="attach_activity_id" package="package0">
          <type name="activity_id" package="package0"></type>
          <value>A3050AC2-36EF-493F-9E37-BF7884EF55DC-2</value>
        </action>
      </event>
    

    每个事件都有一个attach_activity_id 节点,其值几乎相同。但是,如果将其转换为唯一标识符,则该值是相同的!

    神速。您将需要它来进行未来的 XML 粉碎。 :)

    【讨论】:

    • 谢谢!正如我所看到的,需要分别记录这两个事件,然后使用 uid 和自定义查询加入它们,正如您所提到的。没有简单的方法,比如使用一个事件。但是,不是最坏的情况:)
    • 是的。 Extended Events 中的事件在设计上保持精简。但是您距离获得所需的东西还差几个连接。
    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2012-01-01
    • 2011-10-26
    • 2016-04-09
    相关资源
    最近更新 更多