Запуск трассировки
Определив новую трассировку или создав шаблон с помощью SQL Server Profiler, вы сможете запускать, приостанавливать или останавливать сбор данных, используя новое определение трассировки или шаблон.
Запуск трассировки
Когда запускается трассировка, для которой в качестве источника определен экземпляр ядра СУБД Microsoft SQL Server или Analysis Services, SQL Server создает очередь для временного хранения данных о зарегистрированных событиях сервера.
При обращении к трассировке SQL через SQL Server Profiler открывается новое окно трассировки (если еще нет таких открытых окон) и немедленно начинается сбор данных.
При обращении к трассировке SQL с использованием системных хранимых процедур Transact-SQL вам придется заново запускать трассировку каждый раз, когда запускается экземпляр SQL Server, чтобы собирать от него данные. После запуска трассировки можно изменить только ее имя.
При работе с существующими трассировками можно просматривать свойства, но нельзя изменять их. Чтобы изменить свойства, необходимо остановить или приостановить трассировку.
Выполнение приложения SQL Server Profiler
Приложение SQL Server Profiler можно запустить несколькими способами для получения данных трассировки в разных сценариях. Можно запустить Приложение SQL Server Profiler из меню Пуск в Windows, из меню Сервис в помощнике по настройке Компонент Database Engine и из нескольких расположений в SQL Server Management Studio.
При первом запуске Приложение SQL Server Profiler и выборе в меню Файл пункта Создать трассировку приложение отображает диалоговое окно Соединение с сервером, где можно указать экземпляр SQL Server для подключения.
Запуск SQL Server Profiler из меню «Пуск» в Windows
- Щелкните в Windows значок Пуск или нажмите клавишу Windows и начните набирать SQL Server Profiler 18 (или более поздней версии). Когда появится плитка SQL Server Profiler 18, щелкните ее.
Запуск SQL Server Profiler в помощнике по настройке ядра СУБД
- В меню Компонент Database Engine Сервис помощника по настройке компонента выберите SQL Server Profiler.
Запуск SQL Server Profiler в SQL Server Management Studio
Вы можете открыть Приложение SQL Server Profiler из нескольких расположений в SQL Server Management Studio. При запуске приложения Приложение SQL Server Profiler загружается контекст подключения, шаблон трассировки и выполняется фильтрация контекста точки запуска. SQL Server Management Studio запускает каждый сеанс SQL Server Profiler в отдельном экземпляре, выполнение которого продолжается после завершения работы SQL Server Management Studio.
Запуск приложения SQL Server Profiler из меню «Инструменты»
- В меню SQL Server Management Studio Инструменты щелкните SQL Server Profiler.
Запуск приложения SQL Server Profiler из редактора запросов
- В редакторе запросов щелкните правой кнопкой мыши, а затем выберите пункт Трассировка запроса в приложении SQL Server Profiler.
Примечание Контекстом соединения является редактор соединения, шаблон трассировки — TSQL_SP, а применяемый фильтр SPID = окно запроса SPID.
Запуск приложения SQL Server Profiler из монитора активности
- В мониторе активности щелкните панель Процессы, щелкните правой кнопкой процесс, который хотите профилировать, а затем выберите пункт Трассировка процесса в приложении SQL Server Profiler.
Примечание Когда выбран процесс, контекстом соединения является соединение обозревателя объектов при открытии монитора активности. Шаблон трассировки — это шаблон по умолчанию в зависимости от типа сервера, а идентификатор SPID равен идентификатору SPID для выбранного процесса.
Безопасность .NET Framework
- В режиме проверки подлинности Windows учетная запись пользователя, от имени которой запускается приложение Приложение SQL Server Profiler, должна иметь разрешение на подключение к экземпляру SQL Server.
- Для выполнения трассировки в Приложение SQL Server Profilerпользователь должен также иметь разрешение ALTER TRACE.
Как запустить SQL Profiler Trace ночью, в определенное время?
Как запустить SQL profiler trace, когда проблему надо ловить с 3:00 до 3:30 утра? Делать это можно с помощью трейса на стороне сервера, но это крайне неудобно. Именно не сложно, а неудобно, и всегда лень. Наконец я решился автоматизировать это раз и навсегда. Вот так:
Jenkins тут, кстати, совсем необязателен и служит лишь интерфейсом, чтобы вызвать скрипт с нужными параметрами:

Решение я покажу крупными мазками, все равно там много специфики, связанных именно с нашей инфраструктурой. То есть я выполню то, что показано слева:

Итак, bat файл кое что делает и переносит действие уже в PowerShell script, которому передает все параметры и еще две переменные — ‘%BUILD_USER_ID%’,’%BUILD_USER_EMAIL%’ — полученные от Jenkins. Они нам пригодятся позднее:

Как ни странно, в самом ps1 мало что происходит действительно ценного: там вызывается некая процедура, которая по имени сервера создает и возвращает имя директории на специальной share, куда будет положен этот файл. Сервер, где будет создана эта директория зависит от datacenter, где находится сервер, на котором будет запущен трейс. Кроме того, юзеру выдаются права на чтение трейса, и есть процесс который через пару дней чистит эти директории. Как видите, вам это может не понадобится и все это вы можете спокойно пропустить.
Теперь действие переносится уже на сервер, где будет запущен трейс, в SQL файл. loc это как раз параметр, содержащий путь, куда будет скопирован готовый трейс. Вы можете заменить его константой.

Вначале мы должны найти место, куда будем писать трейс файл локально. Например, так:

Далее небольшая чистка. Вдруг такой файл уже есть или трейс ктото запустил раньше? Вам надо будет покверить sys.traces и остановить/удалить трейс пишущий в %jenkinsTraceSch%, если такой уже есть. Дальше создаем трейс (ограничьте его размер!) и немного занудства с вызовами sp_trace_setevent. Вы можете облегчить себе жизнь, сделав CROSS JOIN между events и columns:

Теперь добавим фильтры по вкусу. Тут как раз вы дорисовываете свою сову. Это первое место, где мы используем параметры скрипта — тип фильтра и имя базы:

Теперь пошел трэш:

В @j вы формируем команду для Job, которая будет:
- Ждать нужного времени с помощью WAITFOR
- Запускать трейс
- Выждать заказанное время
- Остановить трейс
- Подождать еще секунду на всякий случай — операции асинхронные
- Формировать команду на копирование трейса в нужное место
- Выполнять ее
- Формировать Subject и body письма
- Отправлять письмо заказчику через sp_send_dbmail со ссылкой на трейс

Я тут слышу крики про xp_cmdshell… Не хочу это комментировать. В конце концов, никто же не должен свидетельствовать на суде против самого себя. Но вы можете поступить иначе. Вряд ли у вас получится отправить трейс по почте — он большой. Хотя вы можете запаковать его. Ну или оставить его на самом сервере и предоставить юзеру забрать его самостоятельно или вытянуть по UNC в доступное для пользователя место
- Jenkins вызывает bat
- bat вызывает powershell
- powershell вызывает скрипт SQL через sqlcmd
- Скрипт создает Job
- Job создает трейс и, перед самойбийством посылает почту:

P.S.: И да, даже если xp_cmdshell запрещен и вы не можете его включить, у вас есть по крайней мере 2 способа написать my_xp_cmdshell. Так что эта «защита» не защищает ни от чего.
- SQL
- Серверное администрирование
- Microsoft SQL Server
- Администрирование баз данных
Работа с SQL Server Profiler. Примеры настройки трассировок
В данной теме я хочу поговорить об очень полезном инструменте — SQL Server Profiler.
Как описано на MSDN, приложение SQL Server Profiler — это графический пользовательский интерфейс для трассировки SQL, с помощью которого можно наблюдать за экземпляром компонента Database Engine. Приложение позволяет собирать и сохранять данные о каждом событии в файле или в таблице для последующего анализа. Данное приложение представляет исключительную важность в задачах анализа производительности исполняемых запросов, а также при анализе проблем параллельности работы в базе данных.
На текущий момент Microsoft продвигает другой аналогичный инструмент — Extended Events и рекомендует пользоваться им, тем не менее я считаю полезным уметь работать и с инструментом Profiler.
Настройка приложения
В профайлере, начиная с версии 2005, в настройках приложения присутствует флажок «Показывать значения в столбце «Продолжительность» в микросекундах» (Show values in Duration column in microseconds). Данный флажок управляет как отображением значения в соответствующей колонке, так и значением, устанавливаемым для отбора по данной колонке. На мой взгляд, при работе с Profiler удобнее использовать микросекунды, поэтому советую данный флажок установить. Настройка находится в меню Сервис (Tools) → Параметры (Options).

Запуск трассировки в Profiler
Для того чтобы запустить новую трассировку в Profiler необходимо:
- Открыть приложение SQL Server Profiler
- Выбрать пункт основного меню «Файл» (File), в нем «Создать трассировку» (New Trace)
- В открывшемся диалоге подключиться к нужному экземпляру SQL Server
- В открывшемся окне настроить трассировку
- Запустить трассировку
Настройка трассировки
Из вышеприведенного списка действий, самым сложным (а по своей сути — единственным) является настройка трассировки. Она имеет множество вариантов, попробуем разобрать основные из них.
Вкладка общие
Первым пунктом предлагается задать имя трассировки, имя можно оставить по умолчанию, но если будет открыто несколько трассировок, удобно именовать их чем-то осознанным.
Следующим пунктом предлагается выбрать шаблон трассировки из списка. В данном списке приводятся некоторые предопределенные шаблоны трассировок. Помимо этого, шаблоны можно дополнить своими, пользовательскими шаблонами. Данная возможность облегчит вам жизнь, поскольку каждый раз настраивать с нуля — не самое приятное занятие.
Вывод данных трассировки может происходить:
- На экран в новом окне — вывод происходит на экран, при этом в дальнейшем трассировку можно будет сохранить как в файл, так и в таблицу в СУБД (даже если опции записи в файл и/или таблицу не были включены)
- Записывать в файл на диске (опционально) — дополнительно к выбранным опциям, данные будут записываться в файл на диске. Далее этот файл можно открыть через профайлер. Эта опция удобна для сохранения и/или для передачи трассировки.
- Записывать в таблицу базы данных (опционально) — дополнительно к выбранным опциям, данные будут записываться в таблицу базы данных. Далее, посредством возможностей предоставляемых СУБД, можно произвести анализ данных, например, найти самые длительные события или просуммировать общую длительность.
Последним пунктом настройки предлагается установить время остановки трассировки, если это требуется.
Перед продолжением настройки установим шаблон «Пустой» (Blank), имя трассировки может быть произвольным, все остальные флажки могут быть сняты.

Вкладка выбора событий
Событие — это действие экземпляра SQL Server Database Engine. Для анализа проблем, возникающих при работе с 1С, существуют определенные наборы событий, с которыми необходимо уметь работать.
Выбор событий — это основная часть настройки трассировки, он предполагает работу с матрицей: «Событие» — «Свойство события». Таким образом, в этой матрице надо установить флажки по тем событиям и их свойствам, которые мы хотим трассировать.
Помимо матрицы событий и их свойств, на форме присутствуют флажки: «Показать все события» (Show all events) и «Показать все столбцы» (Show all columns). При установленном флажке в матрице раскрываются все события/столбцы, при снятом остаются только выбранные. Помимо этого, флажок «Показать все столбцы» влияет на отображение данных в «Фильтры столбцов» — отображаемый список соответствует отображаемым столбцам в матрице. При этом, даже если столбец скрыт (не выбран в матрице и снят флаг «Показать все столбцы»), но отбор на него был установлен — отбор сработает.
«Фильтры столбцов» (Column Filters) — открывает список столбцов по которым можно установить отборы. Если значение события при трассировке не подходит под значение отбора в столбце, данное событие не будет отражено в трассировке. Таким образом, можно установить отбор на информационную базу, по которой необходимо произвести трассировку.
«Упорядочить столбцы» (Organize Columns) — используется для изменения (организации) порядка следования выводимых колонок.

События для получения плана выполнения запроса
Для того чтобы получить план запроса в Profiler следует добавить следующие события:
| Событие | Описание |
|---|---|
| Showplan All | Выводит подробную информацию о предполагаемом плане запроса в текстовом виде |
| Showplan Statistics Profile | Выводит подробную информацию о действительном плане запроса в текстовом виде |
| Showplan XML | Выводит подробную информацию о предполагаемом плане запроса в XML формате (может быть представлен графически) |
| Showplan XML Statistics Profile | Выводит подробную информацию о действительном плане запроса в XML формате (может быть представлен графически) |
Помимо вышеприведенных событий, для получения полной картины происходящего полезно добавить события:
| Событие | Описание |
|---|---|
| RPC:Completed | Происходит при завершении удаленного вызова процедуры |
| SQL:BatchCompleted | Возникает при завершении выполнения инструкции Transact-SQL |
Среди столбцов, выводимых в трассировке, рекомендуется включить: TextData, BinaryData, Reads, Writes, CPU, Duration, SPID.

Также полезно установить фильтры по длительности и базе данных. Как это сделать описано ниже в статье.
Другие способы получения плана запроса (без использования Profiler) описаны в статье «Методы получения плана запроса в СУБД MS SQL Server»
События для получения графа взаимоблокировки
Для получения графа взаимоблокировки достаточно добавить одноименное событие Locks: Deadlock graph.
Событие Deadlock graph возникает одновременно с классом событий Lock: Deadlock. Класс событий Deadlock graph предоставляет XML-описание взаимоблокировки.
Среди столбцов, выводимых в трассировке, рекомендуется включить: EventSequence, SPID, StartTime, TextData.

События для получения информации об эскалации
Для получения информации об эскалации достаточно добавить событие Locks: Escalation.
Событие Escalation возникает при эскалации блокировки, т.е. когда блокировка более мелких фрагментов преобразуется в блокировку более крупных фрагментов.
Также можно ограничить набор выводимых колонок теми данными, которые требуются для анализа.

Установка фильтров столбцов
Установить фильтры можно нажав на кнопку «Фильтры столбцов».

Важно понимать, не все события содержат те или иные колонки. Если событие не содержит колонку по которой установлен фильтр, данное событие отфильтровано не будет.
Очень полезным фильтром является отбор по имени базы или ее идентификатору (если в экземпляре находится несколько баз, а трассировать необходимо какую-то определенную). Для установки фильтра по имени базы необходимо для колонки DatabaseName установить значение «Похоже на» или «Не похоже на». Стоит отметить: если установленному значению будут отвечать несколько баз, тогда события будут собираться по каждой из них. Второй вариант фильтрации событий по определенной базе — установка отбора по колонке DatabaseID. Узнать идентификатор базы данных можно выполнив запрос в SQL Server Management Studio:
