2009-11-09 3 views
0

Мой клиент сталкивается с некоторыми взаимоблокировками при использовании нашего приложения. Я хочу отслеживать все тупики для моих исследований и решать тупики.включить профайлер/Traceon после автоматического перезапуска сервера SQL

В настоящее время я запускаю профилировщик SQL для графа взаимоблокировки событий для захвата сценария взаимоблокировки.

Фактическая проблема заключается в том, что SQL-сервер перезапускается каждый день в 2 часа ночи, а профилировщик прекращает сбор событий после перезапуска. к моменту, когда я прихожу в офис при запуске профайлера, скажем, 10 утра, могут быть тупики, которые я мог пропустить между 2:00 и 10:00. так что я ищу способ, чтобы я мог зафиксировать тупики без моего запуска вручную.

Я думал, что могу использовать 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 вызывает тупик. например, если хранимый proc вызывает другой и снова вызывает другой сохраненный процесс, где происходит тупик, я получу самый внутренний sql, вовлеченный в тупик, используя профилировщик, но не получал бы их без них. поэтому я действительно хочу получить трассировку. – Nikhil

Смежные вопросы