2009-11-09 60 views
0

我的客户端在使用我们的应用程序时遇到了一些死锁。我想跟踪研究的所有僵局并解决僵局。SQL server自动重启后启用profiler/Traceon

我目前正在运行事件死锁图的SQL事件探查器来捕获死锁场景。

实际的问题是SQL服务器每天凌晨2点重新启动,并且分析器在重新启动后停止捕获事件。当我在上午10点开始分析人员时,可能会出现僵局,我可能在凌晨2点和上午10点之间错过了这些僵局。所以我正在寻找一种方式,这样我就可以捕获死锁而无需手动启动。

我想我可以使用TRACEON(1204,-1),以便在SQL Server错误日志中捕获死锁事件。但是我发现TRACE捕获也在重启后被禁用。

有没有办法通过SQL事件探查器捕获死锁或使用TRACEON而无需我手动启动捕获?

尼基尔

回答

0

在这里稍稍晚点来参加派对,但是您可以创建一个存储过程来建立跟踪,然后将其设置为在启动时运行。

USE master; 
GO 

-- define the proc 
CREATE PROCEDURE usp_MakeMyTraceAtStartup AS 
    DECLARE @TraceID INT; 
    DECLARE @on BIT = 1; 
    EXEC sp_trace_create @TraceID output, 6, 'c:\mypath\mytraceout.trc', 5, NULL; 

    -- event 25 is a deadlock; see http://msdn.microsoft.com/en-us/library/ms186265.aspx 
    EXEC sp_trace_setevent @TraceID, 25, 6, @on; -- NTUserName 
    EXEC sp_trace_setevent @TraceID, 25, 7, @on; -- NTDomainName 
    EXEC sp_trace_setevent @TraceID, 25, 8, @on; -- HostName 
    EXEC sp_trace_setevent @TraceID, 25, 10, @on; -- ApplicationName 
    EXEC sp_trace_setevent @TraceID, 25, 11, @on; -- LoginName 
    EXEC sp_trace_setevent @TraceID, 25, 12, @on; -- SPID 
    EXEC sp_trace_setevent @TraceID, 25, 14, @on; -- StartTime 
    EXEC sp_trace_setevent @TraceID, 25, 23, @on; -- Success 
    EXEC sp_trace_setevent @TraceID, 25, 26, @on; -- ServerName 
    EXEC sp_trace_setevent @TraceID, 25, 31, @on; -- Error 
    EXEC sp_trace_setevent @TraceID, 25, 35, @on; -- DatabaseName 
    EXEC sp_trace_setevent @TraceID, 25, 60, @on; -- IsSystem 
    EXEC sp_trace_setevent @TraceID, 25, 64, @on; -- SessionLoginName 
    -- whatever other columns you want to audit 

    -- turn it on 
    EXEC sp_trace_setstatus @TraceID, 1; 
GO 

-- set it to run automatically at startup 
EXEC sp_procoption 'usp_MakeMyTraceAtStartup', 'startup', 'true'; 
GO 

SQL Server 2005及更高版本支持跟踪。

0

不是相反运行轨迹或担心什么是停机后的特定时间之间错过了,要求客户什么样的错误,应用程序返回。如果它们位于应用程序中的特定区域,则应该能够追踪导致死锁的语句。只是我的意见=)。

+0

好吧,在这种情况下,我所得到的仅仅是受害者的SQL,也只是最高级的SQL正在执行。如果我得到一个死锁图,我可以很容易地找到哪个是导致死锁的确切sql。例如,如果一个存储过程调用另一个,然后再次调用另一个存储过程,那么发生死锁的时候,我会使用分析器得到涉及死锁的最内部的sql,但如果没有它们,它们将不会相同。因此我真的很想找到踪迹。 – Nikhil 2009-11-12 06:35:02