Error de punto muerto no devuelve el punto muerto SQL


13

Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Recibo este error al azar cuando uno de mis sitios web está ocupado. Sé aproximadamente en qué conjuntos de tablas está sucediendo, pero en mi experiencia con otros programas, normalmente obtengo el SQL devuelto donde está ocurriendo el punto muerto. ¿Hay una bandera que debería encender para permitir que esto suceda?

Intentaré depurar el punto muerto en sí como un problema separado, ya que esta es mi pregunta principal por ahora.

Estoy usando SQL Server 2008 Standard Edition.


¿Puede reiniciar el servicio? Si puede devolver el servicio, puede agregar agregar el indicador de traza 1204 a los parámetros de inicio para registrar los detalles del punto muerto en el registro de SQL Server. > 1204: Devuelve los recursos y tipos de bloqueos que participan en un punto muerto y también el comando actual afectado. >> Alcance: global solamente
Tevo D

1
Utiliza el administrador de configuración. En Servicios de SQL Server, haga clic con el botón derecho y abra las propiedades. Vaya a la pestaña Avanzado, parámetros de inicio. Tendrá entradas para la ubicación de los archivos de la base de datos maestra y tal. Agregue ;-T1204para que finalice el indicador de seguimiento y reinicie el servicio.
Tevo D

44
¿Por qué reiniciar el servicio? DBCC TRACEON (1204, -1)
Mark Storey-Smith

Desde msdn.microsoft.com/en-us/library/ms188396.aspx : Cambios de comportamiento: en SQL Server 2000, un simple DBCC TRACEON (1204) es suficiente para habilitar el informe de punto muerto en el registro de errores. En SQL Server 2008, debe habilitar el indicador de forma global porque el indicador de nivel de sesión no es visible para el subproceso de monitor de interbloqueo.
Tevo D

2
@TevoD: el -1parámetro que DBCC TRACEONsignifica global.
Martin Smith

Respuestas:


25

Los datos que necesita se registran en el seguimiento de eventos extendidos predeterminado.

DECLARE @xml XML

SELECT @xml = target_data
FROM   sys.dm_xe_session_targets
       JOIN sys.dm_xe_sessions
         ON event_session_address = address
WHERE  name = 'system_health'
       AND target_name = 'ring_buffer'

SELECT   
             XEventData.XEvent.query('(data/value/deadlock)[1]')  AS DeadlockGraph,
             CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') AS XML) AS DeadlockGraph,
              XEventData.XEvent.value('(./@timestamp)[1]', 'DATETIME2') AS [DateTime]
FROM   (SELECT @xml AS TargetData) AS Data
       CROSS APPLY 
       TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent) 
ORDER BY [DateTime] DESC

Aunque ya no estará allí si ha reiniciado el servicio -eg para aplicar un indicador de rastreo o si el búfer ha ciclado mientras tanto.

Puede configurar su propio seguimiento de eventos extendidos que almacena el gráfico de punto muerto en un destino de archivo para un almacenamiento persistente no volátil. Código de ejemplo aquí . Personalmente, encuentro que el XML de gráfico de punto muerto es más amigable que la salida del indicador de seguimiento.

Editar

  1. @MartinC señala en los comentarios que en instancias de SQL Server que no tienen todas las actualizaciones, podría haber un problema al generar XML no válido. La solución para eso es hacer una búsqueda y reemplazar y usar 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 DeadlockGraphen la SELECTlista como se describe aquí .
  2. Wayne Sheffield ha publicado un script útil para destruir el XML del gráfico de punto muerto en formato tabular aquí .

Lamentablemente, EE no captura todos los puntos muertos y parece ser un error: connect.microsoft.com/SQLServer/feedback/details/754115/…
Matt

3

La respuesta aceptada no me funcionó constantemente. Aparentemente, se sabe que el buffer de anillo deja caer eventos en ciertas circunstancias.

ConnectItem

Problemas de Ring Buffer

Los archivos de eventos de registro system_health pueden analizarse (a partir de esta respuesta ):

with XmlDeadlockReports as
(
  select convert(xml, event_data) as EventData
  from sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)
  where substring(event_data, 1, 50) like '%"xml_deadlock_report"%'  
) 
select EventData.value('(event/@timestamp)[1]', 'datetime2(7)') as TimeStamp,
       EventData.query('event/data/value/deadlock') as XdlFile
  from XmlDeadlockReports
 order by TimeStamp desc

El campo XdlFile puede guardarse en un archivo .xdl y leerse en SSMS. Probado en SQL Server 2012.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.