我收到了检查 2008 sp3 服务器(10.0.5500.0 - 企业版(64 位))上的一些错误的请求,看看我是否能找到之前发生的死锁。
Traceflag 1222 未启用,服务器所有者也不想启用它。我使用了扩展事件并使用以下查询提取了一些信息:
SELECT CAST(event_data.value('(event/data/value)[1]',
'varchar(max)') AS XML) AS DeadlockGraph
FROM ( SELECT XEvent.query('.') AS event_data
FROM ( -- Cast the target_data to XML
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'
AND target_name = 'ring_buffer'
) AS Data -- Split out the Event Nodes
CROSS APPLY TargetData.nodes('RingBufferTarget/
event[@name="xml_deadlock_report"]')
AS XEventData ( XEvent )
) AS tab ( event_data )
我收到了很多类似这样的信息:
<deadlock>
<victim-list>
<victimProcess id="process14846ccbc8" />
</victim-list>
<process-list>
<process id="process14846ccbc8" taskpriority="0" logused="0" waitresource="KEY: 25:72057594099728384 (0800dfc12261)" waittime="2842" ownerId="7035766745" transactionname="UPDATE" lasttranstarted="2012-11-20T07:50:25.023" XDES="0x14d9ade3b0" lockMode="U" schedulerid="8" kpid="17268" status="background" spid="19" sbid="0" ecid="0" priority="0" trancount="2">
<executionStack>
<frame procname="" line="53" stmtstart="2674" stmtend="2980" sqlhandle="0x030019002cf5fc35c2449200d2a000000100000000000000" />
</executionStack>
<inputbuf />
</process>
<process id="process3d9bdc8" taskpriority="0" logused="224" waitresource="KEY: 25:72057594099793920 (2f00faaf5d8e)" waittime="2315" ownerId="7035765940" transactionname="user_transaction" lasttranstarted="2012-11-20T07:50:24.913" XDES="0xdad541970" lockMode="U" schedulerid="6" kpid="15448" status="background" spid="23" sbid="0" ecid="0" priority="0" trancount="2">
<executionStack>
<frame procname="" line="549" stmtstart="32736" stmtend="33274" sqlhandle="0x03001900b9667f2bc41ade003ea000000100000000000000" />
<frame procname="" line="549" stmtstart="34038" stmtend="35374" sqlhandle="0x03001900f28a732c051bde003ea000000100000000000000" />
<frame procname="" line="81" stmtstart="4284" stmtend="4392" sqlhandle="0x030019002cf5fc35c2449200d2a000000100000000000000" />
</executionStack>
<inputbuf />
</process>
</process-list>
<resource-list>
<keylock hobtid="72057594099728384" dbid="25" objectname="" indexname="" id="lock6b6a4ba00" mode="X" associatedObjectId="72057594099728384">
<owner-list>
<owner id="process3d9bdc8" mode="X" />
</owner-list>
<waiter-list>
<waiter id="process14846ccbc8" mode="U" requestType="wait" />
</waiter-list>
</keylock>
<keylock hobtid="72057594099793920" dbid="25" objectname="" indexname="" id="lock74edcf180" mode="U" associatedObjectId="72057594099793920">
<owner-list>
<owner id="process14846ccbc8" mode="U" />
</owner-list>
<waiter-list>
<waiter id="process3d9bdc8" mode="U" requestType="wait" />
</waiter-list>
</keylock>
</resource-list>
</deadlock>
如果 objectname="" indexname="" ,我如何找出死锁是什么?
我无法回答为什么缺少信息,但我可以指出如何提取它。
首先,移动到该数据库:
拿那个结果,然后:
现在找出这些 hobt_id 代表什么:
您还可以使用以下方法找到所涉及的批次(如果它们仍然存在):
偏移量在那里,
ExecutionStack
因此您可以根据需要更深入地研究该输出(许多在线使用偏移量的示例)。编辑Sandwiches 先生指出了以下 Connect 项(不再可用),其中 Microsoft 已声明此错误已在 SQL Server 2012 中修复。它不会在 2008/R2 中修复。
http://connect.microsoft.com/SQLServer/feedback/details/635391/objectname-indexname-not-populated-in-deadlock-graph-in-sql2008-sp1-and-sql2008-r2
正如 Aaron 已经说过的,这是由于 SQL Server 2008 / 2008 R2 中的一个错误造成的。该错误已在更高版本中标记为已修复。它不会在 SQL 2008 / 2008 R2 中修复。
我编写了一个 PowerShell 脚本,用于从事件缓冲区中提取死锁,如果可能,添加丢失的信息,并将死锁图写为 .xdl 文件。可以使用文本编辑器或在 SQL Server Management Studio 2012 及更高版本中打开 .xdl 文件。下面的代码适用于 PowerShell 3.0。如果将文件保存为 .psm1,则可以使用 Import-Module 导入它并提供命令行开关 Get-SqlDeadlockHistory。此脚本也适用于更高版本的 SQL Server。
我还发布了这个作为原始错误的解决方法以及可在 PowerShell 2.0 中运行的版本。我在这里发布的版本包含一些改进。不幸的是,我无法编辑我在原始错误上发布的解决方法以匹配。