如何使用扩展事件来跟踪群集SQL Server中的死锁

问题描述 投票:2回答:1

我在两台虚拟机上有两个集群SQL Server(2014年企业版)。在我的Web应用程序的日志中,我看到了死锁错误。所以,我做了在线研究,发现了以下脚本,并在每台服务器上运行:

DECLARE @targetPath nvarchar(512) = N'\MyData'; 

IF EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name = N'DeadlockMonitor')
    RETURN;

DECLARE @productVersionString nvarchar(128) = CONVERT(nvarchar(128), SERVERPROPERTY('ProductVersion'));
DECLARE @productVersion decimal(8, 5) = CAST(LEFT(@productVersionString, CHARINDEX('.', @productVersionString, 4) - 1) AS decimal(8, 5));

IF (@productVersion < 10)
BEGIN
    RAISERROR(N'Extended Events are not supported on this version of SQL Server.', 16, 1) WITH NOWAIT;
    RETURN;
END

DECLARE @fullTargetPath nvarchar(1024) =
    @targetPath +
        (CASE WHEN RIGHT(@targetPath, 1) != N'\' THEN N'\' ELSE N'' END) +
        REPLACE(@@SERVERNAME, N'\', N'$') + 
        N'.xel';


DECLARE @sql nvarchar(MAX) = N'
CREATE EVENT SESSION [DeadlockMonitor] ON SERVER 
    ADD EVENT sqlserver.xml_deadlock_report 
    ADD TARGET package0.' + (CASE WHEN @productVersion < 11 THEN N'asynchronous_file_target' ELSE N'event_file' END) + N'
    (
        SET
            FILENAME = N''' + REPLACE(@fullTargetPath, 'C:', 'E:') + ''',
            MAX_ROLLOVER_FILES = 0
    )
    WITH
    (
        EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY = 15 SECONDS,
        STARTUP_STATE = ON
    );

ALTER EVENT SESSION [DeadlockMonitor] ON SERVER
    STATE = START;'

EXEC(@sql);

运行上述脚本后,在MyData目录中生成了一个文件。

但是,我在Web日志中看到了很多死锁错误,但MyData目录中的文件仍为空。

我做的不对吗?

更多信息

我在我的桌面(开发机器)上使用相同的数据库运行上面的SAME代码,我能够捕获死锁。

sql-server
1个回答
2
投票

既然你说你在网上发现了这个代码,我怀疑

1.你可能没有正确使用路径变量

2.如果这是你的总代码,它将无法工作,因为产品版本需要使用案例陈述进行更精炼。因为你在2014年,我建议忽略这些案例陈述。

我能够从您的代码中获得死锁,以下是仅对路径进行修改并将产品版本设置为14(2017)的结果

enter image description here

此外,您还可以从UI设置扩展事件。此外,默认系统运行状况日志在被覆盖之前的一段时间内包含死锁信息

© www.soinside.com 2019 - 2024. All rights reserved.