Recebi uma solicitação para verificar alguns erros em um servidor sp3 2008 (10.0.5500.0 - Enterprise Edition (64 bits)) e ver se conseguia encontrar impasses que estavam ocorrendo anteriormente.
O Traceflag 1222 não foi ativado e os proprietários do servidor também não quiseram ativá-lo. Usei eventos estendidos e extraí algumas informações usando a seguinte consulta:
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 )
Recebi muitas informações de volta que se pareciam com isso:
<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>
Como posso descobrir quais são os impasses se objectname="" indexname="" ?
Não posso responder por que há informações ausentes, mas posso apontar como extraí-las.
Primeiro, vá para esse banco de dados:
Pegue esse resultado e:
Agora descubra o que esses hobt_ids representam:
Você também pode encontrar os lotes envolvidos (se ainda estiverem por aí) usando:
Os deslocamentos estão lá
ExecutionStack
para que você possa se aprofundar nessa saída, se quiser (muitos exemplos de uso de deslocamentos online).EDIT Mr. Sandwiches apontou o seguinte item Connect (não mais disponível), onde a Microsoft afirmou que este bug foi corrigido no SQL Server 2012. Não será corrigido em 2008/R2.
http://connect.microsoft.com/SQLServer/feedback/details/635391/objectname-indexname-not-populated-in-deadlock-graph-in-sql2008-sp1-and-sql2008-r2
Como Aaron já disse, isso se deve a um bug no SQL Server 2008/2008 R2. O bug foi marcado como corrigido em uma versão posterior. Não será corrigido no SQL 2008/2008 R2.
Eu tenho um script do PowerShell que escrevi para extrair impasses do buffer de eventos, adicionar as informações ausentes, se possível, e gravar os gráficos de impasse como arquivos .xdl. Os arquivos .xdl podem ser abertos com um editor de texto ou no SQL Server Management Studio 2012 e superior. O código abaixo funciona no PowerShell 3.0. Se você salvar o arquivo como .psm1, ele poderá ser importado usando Import-Module e fornecerá o comando Get-SqlDeadlockHistory. Esse script também funciona para versões posteriores do SQL Server.
Também postei isso como uma solução alternativa para o bug original junto com uma versão que funcionará no PowerShell 2.0. A versão que postei aqui contém algumas melhorias. Infelizmente, não posso editar a solução alternativa que postei no bug original para corresponder.