【问题标题】:Deadlock graph from XEvents doesn't produce "good" XML来自 XEvents 的死锁图不会产生“好的”XML
【发布时间】:2013-11-18 00:52:38
【问题描述】:

我正在调查死锁并使用以下查询(我从 Jonathan Kehayias 的 Pluralsight 死锁课程中获得)从扩展事件中提取有关死锁的信息:

SELECT  
    XEvent.query('data[@name="xml_report"]/value/deadlock') AS deadlock_graph 
FROM    (SELECT CAST([target_data] AS XML) AS TargetData 
         FROM sys.dm_xe_session_targets AS st 
         INNER JOIN sys.dm_xe_sessions AS s  
            ON [s].[address] = [st].[event_session_address] 
         WHERE [s].[name] = N'system_health' 
           AND [st].[target_name] = N'ring_buffer') AS Data 
CROSS APPLY TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent); 

奇怪的是,这给了我一个 1 行 1 列的结果集,其中包含一个空值。经过一番挖掘,我发现这是由于内部查询返回的 XML 文档的死锁图部分不是有效的 XML。它看起来像这样:

如您所见,尖括号已全部替换为 HTML 编码。我不明白这是怎么发生的,因为我所做的只是直接从 SSMS 查询数据库。

无论如何,一旦我意识到这个问题,我就能够用正确的尖括号替换所有错误的值,并且我的 XML 是有效的,并且我能够检查死锁。不过我觉得这很奇怪,有人知道为什么死锁图会这样回来吗?

我应该注意到 XML 的其余部分(即除了死锁图之外的其余事件)完美地返回,如您在此处看到的:

这是我的版本信息:

Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) 2012 年 6 月 28 日 08:36:30 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 6.1 (Build 7601: Service Pack 1 )(管理程序)

有人知道发生了什么吗?我觉得它很奇怪。

提前致谢

杰米

【问题讨论】:

    标签: sql-server xml deadlock extended-events


    【解决方案1】:

    Jamie,我相信这是 XML 包装在 XML 中的标准。此查询有效(由 Kehayias 提供)

    SELECT CAST (
        REPLACE (
            REPLACE (
                XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)'),
                '<victim-list>', '<deadlock><victim-list>'),
            '<process-list>', '</victim-list><process-list>')
        AS XML) AS DeadlockGraph
    FROM (SELECT CAST (target_data AS XML) AS TargetData
        FROM sys.dm_xe_session_targets st
        JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address
        WHERE [name] = 'system_health') AS Data
    CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
        WHERE XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report';
    

    【讨论】:

    • 真棒,比你迈克尔。明天早上我会把它放在首位。
    • 这很好用,除了默认计划很糟糕(~1 分钟)。添加选项(maxdop 1)或分成两个查询,因为没有具体化提示。 SqlServer 2012。
    【解决方案2】:

    直接复制/粘贴 Michael 的上述代码导致错误:

    消息 9436,第 16 级,状态 1,第 1 行

    XML 解析:第 5 行,第 15 个字符,结束标记与开始标记不匹配

    所以我摆弄了一下才得到这个:

    SELECT CAST (
                XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)')
        AS XML) AS DeadlockGraph
    FROM (SELECT CAST (target_data AS XML) AS TargetData
        FROM sys.dm_xe_session_targets st
        JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address
        WHERE [name] = 'system_health') AS Data
    CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
        WHERE XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report';
    

    这似乎工作正常。

    HTH

    JT

    【讨论】:

    • 谢谢!得到与您相同的错误。这有帮助。我很惊讶我是第一个支持者...
    【解决方案3】:

    这是另一个版本(用于 SQL Server 2008R2 (SP2)):

    SELECT CAST(CAST(st.target_data AS xml).query('RingBufferTarget/event[@name="xml_deadlock_report"]/data/value/text()').value('.', 'nvarchar(MAX)') AS xml)
    FROM sys.dm_xe_session_targets st
        INNER JOIN sys.dm_xe_sessions s 
            ON st.event_session_address = s.address
    WHERE s.name = 'system_health' AND st.target_name = 'ring_buffer'
    FOR XML PATH('deadlock-list');
    

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多