在SQL server数据库中面临死锁,并且可以在SQL日志中看到死锁条目。如何使用日志条目来查找此死锁的原因?
发布于 2018-09-20 19:36:59
默认情况下,死锁信息由system_health扩展事件跟踪捕获。不需要打开额外的跟踪标志。
可以从SSMS Object Explorer (管理-->扩展事件-->会话--系统健康)或使用T- xml_deadlock查看来自xml_deadlock事件的信息。下面是从文件目标获取死锁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;发布于 2018-09-20 18:28:02
死锁信息可以在SQL Server错误日志中捕获,也可以使用事件探查器/服务器端跟踪捕获。
您可以单独启用这些选项,也可以将它们一起启用。
要打开它们,您可以在查询窗口中发出以下命令,也可以将它们添加为启动参数。如果这些参数是从查询窗口打开的,则下次SQL Server启动时,这些跟踪标志将不会处于活动状态,因此,如果您始终希望捕获此数据,则启动参数是最佳选择。
DBCC TRACEON (1204, -1)
DBCC TRACEON (1222, -1)有关更多详细信息,请参阅以下链接
发布于 2018-09-20 18:27:26
此代码将显示错误日志,其中包含导致死锁的查询。如果OBJECT_ID(' tempdb.dbo.ErrorLog ')不是Null BEGIN DROP TABLE tempdb.dbo.ErrorLog END
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 @SQLhttps://stackoverflow.com/questions/52422764
复制相似问题