Вернуться к статье
Хранимая процедура начала трассировки.
-- Данная хранимая процедура создаст очередь и запустит трассировку
IF object_id(`dbo.sp_start_mytrace`, `P`) IS NOT NULL
DROP PROC dbo.sp_start_mytrace
GO
CREATE PROC dbo.sp_start_mytrace
@spid_filter int = NULL, -- фильтр для идентификатора процесса сервера
@dbid_filter int = NULL, -- фильтр для идентификатора базы данных
@email_address varchar(50) = NULL, -- адрес электронной почты (необязат. параметр)
@filename varchar(260) = NULL – файл с данными трассировки
AS
DECLARE @queue_handle int – описатель очереди
DECLARE @data_columns int – битовая маска столбцов данных
-- Переменные, используемые для отправки сообщения по электронной почте
DECLARE @msg varchar(7990)
DECLARE @subject varchar(100)
DECLARE @NEWLINE char(2)
DECLARE @start_time datetime
DECLARE @host nvarchar(30)
DECLARE @login_name sysname
SET @NEWLINE = char(10) + char(13) – новая строка
-- Выбрать столбцы для сбора информации
SET @data_columns =
67108864 | -- Класс события
1 | -- Текстовые данные
512 | -- Имя приложения
32 | -- Имя пользователя Microsoft Windows NT®
1024 | -- Имя пользователя SQL
131072 | -- Использование CPU
32768 | -- Операции чтения
65536 | -- Операции записи
4096 | -- Продолжительность
16 | -- Идентификатор соединения
2048 | -- Идентификатор процесса SQL (SPID)
8192 -- Время начала
/* Список столбцов данных для сбора информации
Value Description
1 Text data
2 Binary data
4 Database ID
8 Transaction ID
16 Connection ID
32 Microsoft Windows NT® username
64 Windows NT domain name
128 Host name
256 Host process ID
512 Application name
1024 SQL username
2048 SQL process ID (SPID)
4096 Duration
8192 Start time
16384 End time
32768 Reads
65536 Writes
131072 CPU usage
524288 Severity
1048576 Event Subclass
2097152 Object ID
8388608 Index ID
16777216 Integer data
33554432 Server name
67108864 Event Class
*/
-- Создать очередь
EXEC master..xp_trace_addnewqueue
1000, -- максимальный размер очереди, max_items
5, -- таймер, timeout
95, -- верхний порог, thread_boost
90, -- нижний порог, thread_reduce
@data_columns, -- битовая маска столбцов данных
@queue_handle OUTPUT
-- Если не введено имя файла, куда записывать собираемую информацию, то
-- по умолчанию будет использован файл c:\mytraceN.trc, где N – описатель очереди
IF @filename IS NULL
SET @filename = `c:\mytrace` + CAST(@queue_handle AS varchar) + `.trc`
-- Выбрать события, которые должны фиксироваться
-- Запустить EXEC master..xp_trace_geteventnames для получения полного списка
-- классов событий и их имен
-- Событие сессии Connect
EXEC master..xp_trace_seteventclassrequired @queue_handle, 14, 1
-- Событие сессии Disconnect
EXEC master..xp_trace_seteventclassrequired @queue_handle, 16, 1
-- Событие сессии ExistingConnection
EXEC master..xp_trace_seteventclassrequired @queue_handle, 17, 1
-- Событие TSQL RPC:Completed
EXEC master..xp_trace_seteventclassrequired @queue_handle, 10, 1
-- Событие TSQL - SQL:BatchCompleted
EXEC master..xp_trace_seteventclassrequired @queue_handle, 12, 1
-- Установить фильтры
-- Исключить события, сгенерированные Profiler
EXEC master..xp_trace_setappfilter
@queue_handle, -- описатель очереди
NULL, -- включить приложение
`SQL Server Profiler%` – исключить приложение
-- Включить для сбора данных только указанный идентификатор процесса
IF @spid_filter IS NOT NULL
EXEC master..xp_trace_setspidfilter @queue_handle, @spid_filter
-- Включить для сбора данных только указанный идентификатор базы данных
IF @dbid_filter IS NOT NULL
EXEC master..xp_trace_setdbidfilter @queue_handle, @dbid_filter
-- записать полученную информацию в файл
EXEC master..xp_trace_setqueuedestination
@queue_handle, -- описатель очереди
2, -- место для записи результатов (2 - файл,
-- 3 – журнал приложения, 4 - таблица, 5 – другой сервер)
1, -- включено (1 - yes, 0 - no)
NULL, -- сервер
@filename -- объект
-- Добавить строку в таблицу activetraces.
-- Позднее можно обратиться к этой таблице, чтобы выяснить, какую очередь следует
-- удалить, используя хранимую процедуру sp_stop_mytrace.
INSERT INTO master.dbo.activetraces(queue_handle, tracefile_name)
VALUES(@queue_handle, @filename)
-- Отправить сообщение по электронной почте с подробной информацией о трассе
SELECT @start_time = start_time, @host = host, @login_name = login_name
FROM master.dbo.activetraces
WHERE queue_handle = @queue_handle
SET @subject = `Trace: ` + cast(@queue_handle as varchar) + ` started`
SET @msg =
`The following trace has started:` + @NEWLINE +
`Queue Handle: ` + cast(@queue_handle as varchar) + @NEWLINE +
`Start Time: ` + cast(@start_time as varchar) + @NEWLINE +
`Host: ` + @host + @NEWLINE +
`Login Name: ` + @login_name + @NEWLINE +
`Destination File: ` + @filename + @NEWLINE + @NEWLINE +
`Use EXEC sp_stop_mytrace ` + cast(@queue_handle as varchar) + ` to stop it.`
-- Вывод подробной информации о трассировке на экран
PRINT @msg
-- Отправка подробной информации о трассировке по электронной почте
if @email_address is not null
IF @email_address IS NOT NULL
EXEC master..xp_sendmail
@recipients = @email_address,
@message = @msg,
@subject = @subject
-- Начало передачи данных пользователю (начнется запись в файл)
EXEC master..xp_trace_startconsumer @queue_handle
GO