Books and articles about SQL Rambler's Top100 Сменить язык на: Русский 09 July 2020 20:49:51


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

Как писать пользовательские файлы трассировки на T-SQL

Tim Chapman (оригинал: Write custom trace files in TSQL)
Перевод Моисеенко С.И.

SQL Server Profiler

Прежде чем объяснять, как написать пользовательские трассировки на T-SQL, я скажу несколько слов о SQL Server Profiler. Profiler - это пользовательский интерфейс, который позволяет Вам в графической форме создать трассировки SQL Server для мониторинга событий, происходящих на вашем сервере. Это замечательный инструмент для мониторинга событий базы данных, и во многих случаях он является более предпочтительным для написания скриптов пользовательских трассировок для мониторинга вашего сервера, если такой мониторинг нужен вам на короткий промежуток времени. Пользовательский интерфейс прост в использовании, позволяя очень быстро создать трассировку.

Трассировки T-SQL

Одним из главных преимуществ написания пользовательской трассировки на T-SQL является то, что это позволяет Вам быстро задать параметры трассировки, а также запустить трассировку без запуска пользовательского интерфейса в фоновом режиме. Это также великолепно для создания задания на трассировку, запускаемого в определенные периоды времени.

Обычно при работе с SQL Profiler создается трассировка, в которой события перехватываются на ограниченный срок. Вы можете запустить трассировку в SQL Profiler, а затем выйти из программы, сохранив выполнение трассировки, но я не рекомендую это делать. Если Вы собираетесь контролировать события в течение длительного периода времени (то есть обычно несколько дней) или нужно запустить трассировку, когда Вы не сидите за вашим ПК, предпочтительно запускать трассировку на сервере в T-SQL. Или же Вы можете создать хранимую процедуру, которая может выполняться, когда сервер стартует, что гарантирует, что трассировка всегда будет запущена.

Пример трассировки

Чтобы создать трассировку, Вы используете хранимую системную процедуру sp_trace_create, которая принимает набор параметров, например, местоположение файла, где будут сохранены данные трассировки, максимальный размер файла, значение варианта, а возвращает ID созданной трассировки. Ниже скрипт создания трассировки:

DECLARE @TraceID INT
DECLARE @MaxSize bigint

SET @MaxSize = 15

EXECUTE sp_trace_create @TraceID output,
@options = 2, --//сворачивает файл, когда достигается максимальный размер
@tracefile = N'C:Tracefile.trc', --//имя файла трассы
@maxfilesize = @MaxSize --//максимальный размер файла

SELECT @TraceID --//выводим traceid для контроля

Данная процедура создает трассировку на сервере. Чтобы эта трассировка функционировала, я должен привязать к ней столбцы событий и данных, которые хочу контролировать. Есть только одна хранимая процедура, которую необходимо вызвать, чтобы привязать данные. Именно здесь может произойти недоразумение. Столбцы событий и данных передаются в хранимую процедуру как отдельные параметры и числовые значения - потребуется немного внимания для их определения. Следующая статья Microsoft дает полный список событий и связанных с ними столбцов данных.

В нашем примере, я хочу отслеживать время, когда хранимая процедура выполнялась удаленно, или когда выполнялся любой пакет T-SQL; эти события и столбцы - 10 и 12, соответственно. Что касается столбцов данных, то меня интересует, когда был сделан вызов и когда он завершился; как долго выполнялся запрос; где он выполнялся и что выполнялось. Столбцы данных, которые я определил ниже, будут содержать эту информацию:

DECLARE @On BIT
 SET @On = 1
 EXECUTE sp_trace_setevent @TraceID, 10, 15, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 16, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 1, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 9, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 17, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 6, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 10, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 14, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 18, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 11, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 12, @On
 EXECUTE sp_trace_setevent @TraceID, 10, 13, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 15, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 16, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 1, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 9, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 17, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 6, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 10, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 14, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 18, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 11, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 12, @On
 EXECUTE sp_trace_setevent @TraceID, 12, 13, @On

(Примечание: Сейчас самое время, чтобы определить любые фильтры трассировки, если мне требуется создать их. Фильтр трассировки позволяет мне отлавливать только события с определенными значениями в столбцах данных, или события, которые исключают определенные события в столбцах данных. Это замечательно, если Вы не хотите видеть обычно выполняемые события, или если Вас интересует только выполнение определенной хранимой процедуры. Я не буду устанавливать какие бы то ни было фильтры в данном примере.)

Теперь я могу запустить трассировку. Чтобы сделать это, я вызываю системную хранимую процедуру sp_trace_setstatus. Процедура принимает идентификатор трассировки, который я получил выше, и статус 1, который и включает трассировку.

EXECUTE sp_trace_setstatus @TraceID, 1

Я могу проверить, что трассировка запущена правильно с помощью вызова пары системных функций. Чтобы увидеть все трассировки, запущенные в системе, выполните следующее:

SELECT * FROM fn_trace_getinfo(0)

Используя идентификатор только что созданной трассировки (TraceID), я могу видеть, что эта трассировка является второй трассировкой, запущенной на моей системе. Если я хочу посмотреть данные в файле этой трассировки, не открывая физический файл в файловой системе, я могу использовать следующую функцию трассировки, которая возвращает содержание файла в табличном формате:

SELECT * FROM fn_trace_gettable('C:Tracefile.trc',1)

Заключение

Хотя я использую SQL Profiler в 90 процентах случаев мониторинга моих баз данных, иногда мне требуется мониторинг в течение длительного времени, или меня интересуют только определенные моменты времени. В этих случаях неоценимым оказывается написание и выполнение по расписанию моих собственных трассировок.

20/08/2007

На главную страницу

Print  Версия для печати


Usage of any materials of this site is possible
only under condition of mandatory allocation of the direct link to a site
http://www.sqlbooks.ru
on each page where used materials are placed.

 Main   Articles    Books 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.