Sql server 如何在sql server ro14中查找死锁原因?

Sql server 如何在sql server ro14中查找死锁原因?,sql-server,database-deadlocks,Sql Server,Database Deadlocks,在SQL server数据库中遇到死锁,并且可以在SQL日志中看到死锁条目。如何使用日志项查找此死锁的原因?此代码将显示错误日志,其中包含创建死锁的查询。 如果对象ID('tempdb.dbo.ErrorLog')不为空 开始 删除表tempdb.dbo.ErrorLog 结束 死锁信息可以在SQL Server错误日志中捕获,也可以使用探查器/服务器端跟踪捕获 1204-这提供了有关网络中涉及的节点的信息 死锁 1222-以XML格式返回死锁信息 您可以单独打开这些选项,也可以同时打开它们

在SQL server数据库中遇到死锁,并且可以在SQL日志中看到死锁条目。如何使用日志项查找此死锁的原因?

此代码将显示错误日志,其中包含创建死锁的查询。 如果对象ID('tempdb.dbo.ErrorLog')不为空 开始 删除表tempdb.dbo.ErrorLog 结束


死锁信息可以在SQL Server错误日志中捕获,也可以使用探查器/服务器端跟踪捕获

  • 1204-这提供了有关网络中涉及的节点的信息 死锁
  • 1222-以XML格式返回死锁信息
您可以单独打开这些选项,也可以同时打开它们

要启用这些选项,可以在查询窗口中发出以下命令,也可以将其添加为启动参数。如果从查询窗口打开这些标记,则SQL Server下次启动时,这些跟踪标记将不会处于活动状态,因此,如果始终希望捕获此数据,则启动参数是最佳选项

DBCC TRACEON (1204, -1)
DBCC TRACEON (1222, -1)
有关更多详细信息,请参阅以下链接


默认情况下,
系统运行状况
扩展事件跟踪捕获死锁信息。无需启用其他跟踪标志

可以从SSMS对象资源管理器(管理-->扩展事件-->会话--系统运行状况)或使用T-SQL查看
xml\u死锁事件的信息。下面是一个从文件目标获取死锁xml的查询示例。您还可以将死锁xml保存到扩展名为
xdl
的文件中,并在SSMS中打开该文件以获得死锁的图形视图

--get xml_deadlock_report from system_health session file target
WITH
      --get full path to current system_health trace file
      CurrentSystemHealthTraceFile AS (
        SELECT CAST(target_data AS xml).value('(/EventFileTarget/File/@name)[1]', 'varchar(255)') AS FileName
        FROM sys.dm_xe_session_targets
        WHERE
            target_name = 'event_file'
            AND CAST(target_data AS xml).value('(/EventFileTarget/File/@name)[1]', 'varchar(255)') LIKE '%\system[_]health%'
    )
      --get trace folder name and add base name of system_health trace file with wildcard
    , BaseSystemHealthFileName AS (
        SELECT 
            REVERSE(SUBSTRING(REVERSE(FileName), CHARINDEX(N'\', REVERSE(FileName)), 255)) + N'system_health*.xel' AS FileNamePattern
        FROM CurrentSystemHealthTraceFile
        )
      --get xml_deadlock_report events from all system_health trace files
    , DeadLockReports AS (
        SELECT CAST(event_data AS xml) AS event_data
        FROM BaseSystemHealthFileName
        CROSS APPLY sys.fn_xe_file_target_read_file ( FileNamePattern, NULL, NULL, NULL) AS xed
        WHERE xed.object_name like 'xml_deadlock_report'
    )
--display 10 most recent deadlocks
SELECT TOP 10
      DATEADD(hour, DATEDIFF(hour, SYSUTCDATETIME(), SYSDATETIME()), event_data.value('(/event/@timestamp)[1]', 'datetime2')) AS LocalTime
    , event_data AS DeadlockReport
FROM DeadLockReports
ORDER BY LocalTime ASC;
--get xml_deadlock_report from system_health session file target
WITH
      --get full path to current system_health trace file
      CurrentSystemHealthTraceFile AS (
        SELECT CAST(target_data AS xml).value('(/EventFileTarget/File/@name)[1]', 'varchar(255)') AS FileName
        FROM sys.dm_xe_session_targets
        WHERE
            target_name = 'event_file'
            AND CAST(target_data AS xml).value('(/EventFileTarget/File/@name)[1]', 'varchar(255)') LIKE '%\system[_]health%'
    )
      --get trace folder name and add base name of system_health trace file with wildcard
    , BaseSystemHealthFileName AS (
        SELECT 
            REVERSE(SUBSTRING(REVERSE(FileName), CHARINDEX(N'\', REVERSE(FileName)), 255)) + N'system_health*.xel' AS FileNamePattern
        FROM CurrentSystemHealthTraceFile
        )
      --get xml_deadlock_report events from all system_health trace files
    , DeadLockReports AS (
        SELECT CAST(event_data AS xml) AS event_data
        FROM BaseSystemHealthFileName
        CROSS APPLY sys.fn_xe_file_target_read_file ( FileNamePattern, NULL, NULL, NULL) AS xed
        WHERE xed.object_name like 'xml_deadlock_report'
    )
--display 10 most recent deadlocks
SELECT TOP 10
      DATEADD(hour, DATEDIFF(hour, SYSUTCDATETIME(), SYSDATETIME()), event_data.value('(/event/@timestamp)[1]', 'datetime2')) AS LocalTime
    , event_data AS DeadlockReport
FROM DeadLockReports
ORDER BY LocalTime ASC;