我正在调查死锁并使用以下查询(我从 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) Jun 28 2012 08:36:30 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor) )
有人知道发生了什么吗?我觉得比较奇特。
提前致谢
杰米