代码之家  ›  专栏  ›  技术社区  ›  curious1

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

  •  2
  • curious1  · 技术社区  · 7 年前

    我在两个虚拟机上有两个群集SQL Server(2014 enterprise)。在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日志中看到了许多死锁错误,但是 我的数据 目录仍然为空。

    我做的不对?

    更多信息

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   TheGameiswar    7 年前

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

    1.您可能没有正确使用path变量

    如果这是您的全部代码,那么它将不起作用,因为产品版本需要使用case语句进行进一步细化。既然你在2014年,我建议你不要理会那些案件陈述。。

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

    enter image description here

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