首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在sql server ro14中查找死锁原因?

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

Stack Overflow用户
提问于 2018-09-20 18:17:13
回答 3查看 2.2K关注 0票数 2

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

EN

回答 3

Stack Overflow用户

发布于 2018-09-20 19:36:59

默认情况下,死锁信息由system_health扩展事件跟踪捕获。不需要打开额外的跟踪标志。

可以从SSMS Object Explorer (管理-->扩展事件-->会话--系统健康)或使用T- xml_deadlock查看来自xml_deadlock事件的信息。下面是从文件目标获取死锁xml的查询示例。您还可以将死锁xml保存到扩展名为xdl的文件中,然后在SSMS中打开该文件以查看死锁的图形视图。

代码语言:javascript
复制
--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;
票数 4
EN

Stack Overflow用户

发布于 2018-09-20 18:28:02

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

  • 1204 -这提供有关死锁
  • 1222中涉及的节点的信息-以XML格式返回死锁信息

您可以单独启用这些选项,也可以将它们一起启用。

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

代码语言:javascript
复制
DBCC TRACEON (1204, -1)
DBCC TRACEON (1222, -1)

有关更多详细信息,请参阅以下链接

票数 1
EN

Stack Overflow用户

发布于 2018-09-20 18:27:26

此代码将显示错误日志,其中包含导致死锁的查询。如果OBJECT_ID(' tempdb.dbo.ErrorLog ')不是Null BEGIN DROP TABLE tempdb.dbo.ErrorLog END

代码语言:javascript
复制
 CREATE TABLE tempdb.dbo.ErrorLog 
 (Id int IDENTITY (1, 1) NOT NULL, 
  logdate DATETIME, procInfo VARCHAR(10), 
  ERRORLOG VARCHAR(MAX))

  -- insert the actual data from the Error log into our newly created table.

 INSERT INTO tempdb.dbo.ErrorLog
 EXEC master.dbo.sp_readerrorlog


declare @sql nvarchar(max)
set @sql='select logdate, procInfo, ERRORLOG from tempdb.dbo.ErrorLog 
where Id >= (select top 1 id  from tempdb.dbo.ErrorLog WHERE ERRORLOG Like 
''%deadlock-list%'' order by id desc)'
select @SQL
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52422764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档